ElasticSearch中的BoolFilter和BoolQuery

时间:2015-07-06 19:12:43

标签: elasticsearch

我正在向两个搜索请求申请一个过滤器和一个语义相同的查询:

static FilterBuilder filter(String field1Value, String field2Value){
    return FilterBuilders.boolFilter().must(FilterBuilders.termFilter("field1",field1Value)).should(FilterBuilders.termFilter("field2",field2Value));
}
static QueryBuilder query(String field1Value, String field2Value){
    return QueryBuilders.boolQuery().must(QueryBuilders.termQuery("field1",field1Value)).should(QueryBuilders.termQuery("field2",field2Value));
}
client.prepareSearch(indexName).setPostFilter(filter("hello", "world")).setTypes("mytype");
client.prepareSearch(indexName).setQuery(query("hello","world")).setTypes("mytype");

但是,使用查询搜索返回结果时,使用过滤器的搜索不会返回任何结果。这两个人不应该表现得相同,如果没有,为什么?

1 个答案:

答案 0 :(得分:1)

它们并不完全相同。 在带有must子句的bool查询中,如果查询中没有明确的minimum_should_match,则如果所有子句都不匹配,则文档将匹配。

在过滤器bool查询中,至少需要满足一个条款才能使文档被视为匹配。在过滤器中,没有minimum_should_match的选项,可以将其视为始终设置为1。

即过滤器可以按如下方式查看

 [must_clause] && [should_clause1 || should_clause_2]

对于OP中的示例:

1)当且仅当文档符合 must clause 中的field1条件和 should clause 中的field2条件时,文档才会通过过滤器。

2)对于bool查询,如果满足must-clause,则将文档视为匹配就足够了,即field1匹配