本文介绍了elasticsearch bool 查询结合 must 与 OR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在尝试将基于 solr 的应用程序迁移到 elasticsearch.

I am currently trying to migrate a solr-based application to elasticsearch.

我有这个 lucene 查询

I have this lucene query

(( 
    name:(+foo +bar) 
    OR info:(+foo +bar) 
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)

据我所知,这是 MUST 子句与布尔 OR 的组合:

As far as I understand this is a combination of MUST clauses combined with boolean OR:

获取包含 (foo AND bar in name) OR (foo AND bar in info) 的所有文档.然后通过条件 state=1 过滤结果并提升具有图像的文档."

"Get all documents containing (foo AND bar in name) OR (foo AND bar in info). After that filter results by condition state=1 and boost documents that have an image."

我一直在尝试使用带有 MUST 的 bool 查询,但我无法将布尔 OR 放入 must 子句中.这是我所拥有的:

I have been trying to use a bool query with MUST but I am failing to get boolean OR into must clauses. Here is what I have:

GET /test/object/_search
{
  "from": 0,
  "size": 20,
  "sort": {
    "_score": "desc"
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "foo"
          }
        },
        {
          "match": {
            "name": "bar"
          }
        }
      ],
      "must_not": [],
      "should": [
        {
          "match": {
            "has_image": {
              "query": 1,
              "boost": 100
            }
          }
        }
      ]
    }
  }
}

如您所见,缺少信息"的 MUST 条件.

As you can see, MUST conditions for "info" are missing.

有人有解决办法吗?

非常感谢.

** 更新 **

我已经更新了我的 elasticsearch 查询并去掉了那个函数分数.我的基本问题仍然存在.

I have updated my elasticsearch query and got rid of that function score. My base problem still exists.

推荐答案

我终于设法创建了一个完全符合我想要的查询:

I finally managed to create a query that does exactly what i wanted to have:

过滤后的嵌套布尔查询.我不确定为什么没有记录下来.也许这里有人可以告诉我?

A filtered nested boolean query.I am not sure why this is not documented. Maybe someone here can tell me?

这是查询:

GET /test/object/_search
{
  "from": 0,
  "size": 20,
  "sort": {
    "_score": "desc"
  },
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "state": 1
              }
            }
          ]
        }
      },
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "match": {
                      "name": "foo"
                    }
                  },
                  {
                    "match": {
                      "name": "bar"
                    }
                  }
                ],
                "should": [
                  {
                    "match": {
                      "has_image": {
                        "query": 1,
                        "boost": 100
                      }
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "match": {
                      "info": "foo"
                    }
                  },
                  {
                    "match": {
                      "info": "bar"
                    }
                  }
                ],
                "should": [
                  {
                    "match": {
                      "has_image": {
                        "query": 1,
                        "boost": 100
                      }
                    }
                  }
                ]
              }
            }
          ],
          "minimum_should_match": 1
        }
      }    
    }
  }
}

在伪 SQL 中:

SELECT * FROM /test/object
WHERE 
    ((name=foo AND name=bar) OR (info=foo AND info=bar))
AND state=1

请记住,这取决于您的文档字段分析和映射,如何在内部处理 name=foo.这可以从模糊到严格的行为.

Please keep in mind that it depends on your document field analysis and mappings how name=foo is internally handled. This can vary from a fuzzy to strict behavior.

"minimum_should_match": 1 表示,至少有一个 should 语句必须为真.

"minimum_should_match": 1 says, that at least one of the should statements must be true.

这个语句意味着只要结果集中有一个包含 has_image:1 的文档,它就会被提升 100 倍.这会改变结果排序.

This statements means that whenever there is a document in the resultset that contains has_image:1 it is boosted by factor 100. This changes result ordering.

"should": [
  {
    "match": {
      "has_image": {
        "query": 1,
        "boost": 100
      }
    }
   }
 ]

祝大家玩得开心:)

这篇关于elasticsearch bool 查询结合 must 与 OR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-22 04:32