欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 综合教程 >内容正文

综合教程

ElasticSearch(must、should、filter、must_not) bool的查询

发布时间:2023/12/13 综合教程 33 生活家
生活随笔 收集整理的这篇文章主要介绍了 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);
        }

总结

以上是生活随笔为你收集整理的ElasticSearch(must、should、filter、must_not) bool的查询的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。