ElasticSearch(must、should、filter、must_not) bool的查询
ElasticSearch的组合查询
现实的查询需求从来都没有那么简单;它们需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。为了构建类似的高级查询,你需要一种能够将多查询组合成单一查询的查询方法。
你可以用 bool
查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询(Bool)。
代码示例:
//new 一个查询对象 BoolQueryBuilder boolQueryBuilder1 = QueryBuilders.boolQuery(); //也可以 BoolQueryBuilder boolQueryBuilder = boolQuery();
它主要的几个方法如下:
1.must
文档 必须 匹配这些条件才能被包含进来。相当于sql中的 and
2.must_not
文档 必须不 匹配这些条件才能被包含进来。相当于sql中的 not
3.should
如果满足这些语句中的任意语句,将增加 _score
,否则,无任何影响。它们主要用于修正每个文档的相关性得分。相当于sql中的or
4.filter
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
构造查询条件
1. termQuery:精确查询(不分词)
使用termQuery要注意的是,Elasticsearch5之后,取消了string类型,将原来的string类型拆分为text和keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。
2. matchQuery:匹配查询(分词)
match query搜索的时候,首先会解析查询字符串,进行分词,然后查询,所以假如我搜索的条件输入的是"六年级",则会把各个年级(一年级至九年级)的数据都查询出来,因为其中都包含’年级’ 。
3. queryString:精确查询
4. wildcardQuery:模糊查询
5. rangeQuery:范围查询
代码示例:
BoolQueryBuilder boolQueryBuilder = boolQuery(); //精确查询 if (searchDto.getId() != null) { boolQueryBuilder.must().add(termQuery("id", searchDto.getId())); } //模糊查询 if (searchDto.getSkuLike() != null) { boolQueryBuilder.must().add(wildcardQuery("sku",StrUtil.format("*{}*",searchDto.getSkuLike()))); } //范围查询 if (searchDto.getSupplierAddTimeStart() != null) { boolQueryBuilder.must().add(rangeQuery("create_time").gte(searchDto.getSupplierAddTimeStart())); } // if (searchDto.getSupplierAddTimeEnd() != null) { boolQueryBuilder.must().add(rangeQuery("create_time").lte(searchDto.getSupplierAddTimeEnd())); } // or查询的情况 (Condition 1 OR Condition 2) AND Condition3 if (searchDto.getKeyword() != null) { BoolQueryBuilder childBoolQueryBuilder = boolQuery(); childBoolQueryBuilder.should().add(wildcardQuery("sku",StrUtil.format("*{}*",searchDto.getKeyword()))); childBoolQueryBuilder.should().add(wildcardQuery("title",StrUtil.format("*{}*",searchDto.getKeyword()))); boolQueryBuilder.must().add(childBoolQueryBuilder); }