【问题标题】:In elasticsearch, must match one of array, with optional extra query term在elasticsearch中,必须匹配数组之一,带有可选的额外查询词
【发布时间】:2016-03-07 17:40:41
【问题描述】:

我正在尝试创建一个弹性搜索查询,该查询必须匹配单独字段上的三个查询之一,并且还有一个不需要匹配的额外查询。使用 bool 查询和 MUST 子句的问题在于它必须匹配所有 3,并且使用 SHOULD 它并不总是匹配所需的,除非使用 minimum_should_match 设置为 2。在这种情况下,它与文档不匹配由于最小匹配,匹配 3 个必需的之一。

我当前的查询是这样的(对不起,这里没有代码)

query - bool - must - query 1 - query 2 - query 3 - should - query 4

我也尝试了以下方法,但它不会使第四个查询成为可选

query - bool - should - query 1 - query 2 - query 3 - query 4 - minimum_should_match: 2

如何创建一个查询,该查询必须匹配三个查询之一,并可选择将第四个查询的排名更高。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    嵌套 bool 查询应该会为您提供所需的结果。我们需要匹配查询一、二或三,同时可选地匹配查询 4。

    "query": {
        "bool": {
            "must": [
               {
                   "bool": {
                       "should": [
                          {
                              //query1
                          },
                          {
                              //query2
                          },
                          {
                              //query3
                          }
                       ],
                       "minimum_number_should_match": 1
                   }
               }
            ],
            "should": [
               {
                   //query4
               }
            ]
        }
    }
    

    查询必须至少匹配查询 1 到 3 的 should 子句之一,并且可选地应该匹配查询 4。

    同时匹配查询 1、2、3 和 4 的文档 将排名最高,因为我认为您的意思不是排他或。

    【讨论】:

    • 这个工作完美,以前的版本做了类似的事情没有添加任何得分,但是这个做了,非常感谢!
    • 这不起作用。返回的错误是:[bool] 查询不支持 [minimum_number_should_match] 查看文档,这从未被支持,但现在抛出了正确的错误。
    • 这适用于 ElasticSearch 7.0
    • minimum_should_match 适用于 v7.1。 elastic.co/guide/en/elasticsearch/reference/current/…
    • 为了跟进大家关于minimum_should_match 兼容性的cmets,至少从ES 1.6 开始,这一直是should 的一部分。据我所知,上述查询应该适用于每个版本的 ES?
    猜你喜欢
    • 2021-12-08
    • 2017-07-29
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多