Bool 查询

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-bool-query.html

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=4882896

贡献者 : 蓝色飞扬

<< Constant Score Query Dis Max Query >>


Bool Query

与其他查询的bool组合相匹配的文档的查询。布尔查询映射到 LuceneBooleanQuery 。它使用一个或者多个布尔条件来构建,每个条件都有一个类型出现,出现的类型有:

事件 描述
must 子句(查询)必须出现在匹配的文档中,并将有助于得分。
filter 子句(查询)必须出现在匹配的文档中。 然而不像 must 此查询的分数将被忽略。
should 子句(查询)应出现在匹配文档中。 在布尔查询中不包含 mustfilter 子句,一个或多个should 子句必须有相匹配的文件。 匹配 should 条件的最小数目可通过设置minimum_should_match 参数。
must_not 子句(查询)不能出现在匹配的文档中。

Bool 查询 - 图1 Bool在过滤器上下文中查询

  1. 如果该查询是在过滤器的上下文中使用,它的**should** 子句则至少有一个 **should** 子句需要相匹配

Bool Query 也支持 disable_coord 参数(默认为 false)。基本上,坐标相似性基于文档包含的所有查询项的分数来计算得分因子。 可查阅 LuceneBooleanQuery 了解更多详情。 Bool Query 遵循 more-matches-is-better 的方法,所以每个匹配 mustshould 条件的分数将被累加在一起,从而将最终 _score 提供给每个文档。

  1. POST _search{
  2. "query": {
  3. "bool" : {
  4. "must" : {
  5. "term" : { "user" : "kimchy" }
  6. },
  7. "filter": {
  8. "term" : { "tag" : "tech" }
  9. },
  10. "must_not" : {
  11. "range" : {
  12. "age" : { "from" : 10, "to" : 20 }
  13. }
  14. },
  15. "should" : [
  16. { "term" : { "tag" : "wow" } },
  17. { "term" : { "tag" : "elasticsearch" } }
  18. ],
  19. "minimum_should_match" : 1,
  20. "boost" : 1.0
  21. }
  22. }}

使用bool.filter得分

这种情况下指定的查询如使用filter元素对得分没有影响-得分以返回0 。 分数仅受指定查询的影响。 举例来说,当给定的全部文档status字段包含 active 属性时,以下所述三个查询返回所有文档 。 第一个查询分配比分0的所有文档,因此需指定为没有进球的查询:

  1. GET _search{
  2. "query": {
  3. "bool": {
  4. "filter": {
  5. "term": {
  6. "status": "active"
  7. }
  8. }
  9. }
  10. }}

第二个 Bool 查询包含一个 match_all 查询,为所有文件分配一个1.0的得分。

  1. GET _search{
  2. "query": {
  3. "bool": {
  4. "must": {
  5. "match_all": {}
  6. },
  7. "filter": {
  8. "term": {
  9. "status": "active"
  10. }
  11. }
  12. }
  13. }}

第三个 constant_score 查询的作用与上述第二个例子完全相同。 constant_score 查询分配由过滤器所匹配的所有文档一个1.0的得分。

  1. GET _search{
  2. "query": {
  3. "constant_score": {
  4. "filter": {
  5. "term": {
  6. "status": "active"
  7. }
  8. }
  9. }
  10. }}

使用命名查询来看看哪些子句匹配

如果你需要知道与 bool 查询返回的所有文档相匹配的此查询中的子句,你可以使用命名查询给每个条件分配一个名称。


<< Constant Score Query Dis Max Query >>