ElasticSearch 中boolQueryBuilder的使用

转载自:https://blog.csdn.net/metheir/article/details/85080334

1. 为什么filter会快?

filename already exists, renamed
看上面的流程图就能很明显的看到,filterquery还是有很大的区别的。

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

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

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

  • 1 对结果进行缓存
  • 2 避免计算分值
2. bool查询的使用

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

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

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

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

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

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

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

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

3.JavaAPI使用
大专栏   ElasticSearch 中boolQueryBuilder的使用ava">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

public void () throws IOException {
SearchRequest searchRequest = new SearchRequest("item");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

boolQueryBuilder.must(QueryBuilders.matchQuery("scompCode", "G0000001"));
// 模糊查询
boolQueryBuilder.filter(QueryBuilders.wildcardQuery("itemDesc", "*手机*"));
// 范围查询 from:相当于闭区间; gt:相当于开区间(>) gte:相当于闭区间 (>=) lt:开区间(<) lte:闭区间 (<=)
boolQueryBuilder.filter(QueryBuilders.rangeQuery("itemPrice").from(4500).to(8899));
sourceBuilder.query(boolQueryBuilder);

searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
logger.info("查询数据:{}", Arrays.toString(searchResponse.getHits().getHits()));
}

猜你喜欢

转载自www.cnblogs.com/dajunjun/p/11710894.html