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

时间:2017-05-18 10:32:49

标签: elasticsearch

这可能是一个重复的问题,但我没有找到'一个很好的解决方案。

我试图搜索elasticsearch以获取包含以下内容的文档:

- "event":"myevent1"
- "event":"myevent2"
- "event":"myevent3"

文档不得在同一文档中包含所有文档,但结果应仅包含仅包含这些类型事件的文档。 这很简单,因为elasticsearch帮助我完成should条款 这正是我想要的。 但是,我希望所有文档必须包含另一个条件,我想要字段result.example.example = 200,这必须在每个文档中,并且文档应该是之前描述的"event"中的一个。

因此,例如,文档包含"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字段的文档。

希望我解释得很好, 提前谢谢!

1 个答案:

答案 0 :(得分:1)

按原样,您的查询会告诉ES查找必须具有"operation.result.http_status":200的文档并提升那些具有匹配事件类型的文档。

您希望合并两个must个查询

  • 与您的某个事件类型相匹配的
  • 一个适合您的其他条件

event子句接受多个值,这些值是完全匹配的:您正在寻找terms query

尝试

{
    "query": {
        "bool": {
            "must": [
                {"match":{"operation.result.http_status":200}},
                {
                    "terms" : {
                        "event" : [
                            "bank.account.patch", 
                            "bank.account.add", 
                            "bank.user.patch"
                         ]
                    }
                }
            ]

        }
    }
}