如何在 elasticsearch 中使用多字段搜索,结合 should和must子句


这可能是

一个重复的问题,但我没有找到一个好的解决方案。

我正在尝试搜索弹性搜索以获取包含以下内容的文档:

- "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"
                         ]
                    }
                }
            ]
        }
    }
}

最新更新