我正在向两个搜索请求申请一个过滤器和一个语义相同的查询:
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");
但是,使用查询搜索返回结果时,使用过滤器的搜索不会返回任何结果。这两个人不应该表现得相同,如果没有,为什么?
答案 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匹配