Elasticsearch在2.x版本的时候把filter查询给摘掉了,所以在query dsl里面已经找不到filter query了。其实es并无彻底抛弃filter query,而是它的设计与以前的query过重复了。所以直接给转移到了bool查询中。html
Bool查询如今包括四种子句,must,filter,should,must_not。缓存
看上面的流程图就能很明显的看到,filter与query仍是有很大的区别的。elasticsearch
好比,query的时候,会先比较查询条件,而后计算分值,最后返回文档结果;ide
而filter则是先判断是否知足查询条件,若是不知足,会缓存查询过程(记录该文档不知足结果);知足的话,就直接缓存结果。ui
综上所述,filter快在两个方面:设计
Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每一个子句都有特定的类型。code
返回的文档必须知足must子句的条件,而且参与计算分值htm
返回的文档必须知足filter子句的条件。可是不会像Must同样,参与计算分值blog
返回的文档可能知足should子句的条件。在一个Bool查询中,若是没有must或者filter,有一个或者多个should子句,那么只要知足一个就能够返回。minimum_should_match
参数定义了至少知足几个子句。文档
返回的文档必须不知足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 } }
在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" } } } } }
若是想知道究竟是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" } } } }