一个重复的问题,但我没有找到一个好的解决方案。
我正在尝试搜索弹性搜索以获取包含以下内容的文档:
- "event":"myevent1"
- "event":"myevent2"
- "event":"myevent3"
文档不得在同一文档中包含所有这些文档,但结果应仅包含仅具有这些类型事件的文档。这很简单,因为 elasticsearch 帮助我解决了子句should
它完全返回我想要的。但是,我希望所有文档都必须包含另一个条件,即我希望字段result.example.example = 200
并且必须在每个文档中,并且文档应该是前面描述的"event"
中的1
因此,例如,一个文档有"event":"myevent1"
,另一个文档result.example.example = 200
"event":"myevent2"
和result.example.example = 200
等。
我尝试过这种配置:
{
"query": {
"bool": {
"must":{"match":{"operation.result.http_status":200}},
"should": [
{
"match": {
"event": "bank.account.patch"
}
},
{
"match": {
"event": "bank.account.add"
}
},
{
"match": {
"event": "bank.user.patch"
}
}
]
}
}
}
但不起作用,因为我也得到不包含 1 个应该字段的文档。
希望我解释得很好,提前感谢!
按原样,您的查询会告诉 ES 查找必须具有"operation.result.http_status":200
的文档,并提升具有匹配事件类型的文档。
您希望合并两个must
查询
- 与您的某种事件类型匹配的事件,
- 一个用于您的其他情况
event
子句接受多个值,这些值完全匹配:您正在寻找一个terms
查询。
尝试
{
"query": {
"bool": {
"must": [
{"match":{"operation.result.http_status":200}},
{
"terms" : {
"event" : [
"bank.account.patch",
"bank.account.add",
"bank.user.patch"
]
}
}
]
}
}
}