阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Elasticsearch查询——布尔查询Bool Query

124次阅读
没有评论

共计 2646 个字符,预计需要花费 7 分钟才能阅读完成。

Elasticsearch 在 2.x 版本的时候把 filter 查询给摘掉了,因此在 query dsl 里面已经找不到 filter query 了。其实 es 并没有完全抛弃 filter query,而是它的设计与之前的 query 太重复了。因此直接给转移到了 bool 查询中。

Bool 查询现在包括四种子句,must,filter,should,must_not。

为什么 filter 会快?

Elasticsearch 查询——布尔查询 Bool Query

看上面的流程图就能很明显的看到,filter 与 query 还是有很大的区别的。

比如,query 的时候,会先比较查询条件,然后计算分值,最后返回文档结果;

而 filter 则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果。

综上所述,filter 快在两个方面:

  • 1 对结果进行缓存
  • 2 避免计算分值

bool 查询的使用

Bool 查询对应 Lucene 中的 BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型。

must

返回的文档必须满足 must 子句的条件,并且参与计算分值

filter

返回的文档必须满足 filter 子句的条件。但是不会像 Must 一样,参与计算分值

should

返回的文档可能满足 should 子句的条件。在一个 Bool 查询中,如果没有 must 或者 filter,有一个或者多个 should 子句,那么只要满足一个就可以返回。minimum_should_match 参数定义了至少满足几个子句。

must_nout

返回的文档必须不满足 must_not 定义的条件。

如果一个查询既有 filter 又有 should,那么至少包含一个 should 子句。

bool 查询也支持禁用协同计分选项 disable_coord。一般计算分值的因素取决于所有的查询条件。

bool 查询也是采用 more_matches_is_better 的机制,因此满足 must 和 should 子句的文档将会合并起来计算分值。

{"bool" : {"must" : {"term" : {"user" : "kimchy" }
        },
        "filter": {"term" : {"tag" : "tech" }
        },
        "must_not" : {"range" : {"age" : {"from" : 10, "to" : 20 }
            }
        },
        "should" : [
            {"term" : {"tag" : "wow" }
            },
            {"term" : {"tag" : "elasticsearch" }
            }
        ],
        "minimum_should_match" : 1,
        "boost" : 1.0
    }
}

bool.filter 的分值计算

在 filter 子句查询中,分值将会都返回 0。分值会受特定的查询影响。

比如,下面三个查询中都是返回所有 status 字段为 active 的文档

第一个查询,所有的文档都会返回 0:

GET _search
{"query": {"bool": {"filter": {"term": {"status": "active"
        }
      }
    }
  }
}

下面的 bool 查询中包含了一个 match_all,因此所有的文档都会返回 1

GET _search
{"query": {"bool": {"must": {"match_all": {}},
      "filter": {"term": {"status": "active"
        }
      }
    }
  }
}

constant_score 与上面的查询结果相同,也会给每个文档返回 1:

GET _search
{"query": {"constant_score": {"filter": {"term": {"status": "active"
        }
      }
    }
  }
}

使用 named query 给子句添加标记

如果想知道到底是 bool 里面哪个条件匹配,可以使用 named query 查询:

{"bool" : {"should" : [{"match" : {"name.first" : {"query" : "shay", "_name" : "first"} }},
            {"match" : {"name.last" : {"query" : "banon", "_name" : "last"} }}
        ],
        "filter" : {"terms" : {"name.last" : ["banon", "kimchy"],
                "_name" : "test"
            }
        }
    }
}

ElasticSearch 最新版本 2.20 发布下载了   http://www.linuxidc.com/Linux/2016-02/128166.htm

Linux 上安装部署 ElasticSearch 全程记录  http://www.linuxidc.com/Linux/2015-09/123241.htm

Elasticsearch 安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm

ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm

ElasticSearch 集群搭建实例  http://www.linuxidc.com/Linux/2015-02/114243.htm

分布式搜索 ElasticSearch 单机与服务器环境搭建  http://www.linuxidc.com/Linux/2012-05/60787.htm

ElasticSearch 的工作机制  http://www.linuxidc.com/Linux/2014-11/109922.htm 

Elasticsearch 的安装,运行和基本配置 http://www.linuxidc.com/Linux/2016-07/133057.htm

使用 Elasticsearch + Logstash + Kibana 搭建日志集中分析平台实践  http://www.linuxidc.com/Linux/2015-12/126587.htm

Ubuntu 14.04 搭建 ELK 日志分析系统 (Elasticsearch+Logstash+Kibana) http://www.linuxidc.com/Linux/2016-06/132618.htm

Elasticsearch1.7 升级到 2.3 实践总结  http://www.linuxidc.com/Linux/2016-11/137282.htm

ElasticSearch 的详细介绍 :请点这里
ElasticSearch 的下载地址 :请点这里 

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/137320.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计2646字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中