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);
        }