带有嵌套AND / OR查询的Elasticsearch

时间:2019-06-07 08:56:05

标签: elasticsearch

我正在努力编写具有多个AND / OR条件的弹性搜索查询。

基本上,它涉及以下逻辑: cond1 && (cond2 || cond3 || cond4)

docs中所述,如果文档仅满足must子句,则将其视为匹配项。在这种情况下,should子句起到了促进作用,即,如果文档除must子句之外还与一个或多个should子句匹配,则假设cond2,cond3和cond4是计算相关性得分。

问题是我只希望文档也符合至少一个OR条件。

请注意,我正在运行ES6.3。我也尝试过Multiword queries,但这些结果也是错误的。

添加boost似乎不会影响结果,我得到的结果仅符合第一个条件。

{
    "query": {
        "bool": {
            "must": [
              {
                    "term": {
                        "event.keyword": {
                            "value": "webhook.trigger"
                        }
                    }
                }
            ],
            "should": [
                {
                    "match": {
                        "metaData.webhook.title": "My Example Title 1"
                    }
                },
                {
                    "match": {
                        "metaData.webhook.title": "Testing"
                    }
                },
{
                    "match": {
                        "metaData.webhook.url": "myurl.com"
                    }
                }
            ]
        }
    }
}

1 个答案:

答案 0 :(得分:2)

仅当没有should查询时,must查询才能像 OR 一样工作。在您的情况下,您应该将should查询换成另一个bool查询。

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "event.keyword": {
                            "value": "webhook.trigger"
                        }
                    }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "match": {
                                    "metaData.webhook.title": "My Example Title 1"
                                }
                            },
                            {
                                "match": {
                                    "metaData.webhook.title": "Testing"
                                }
                            },
                            {
                                "match": {
                                    "metaData.webhook.url": "myurl.com"
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}```