Elasticsearch查询以及聚合查询

这篇具有很好参考价值的文章主要介绍了Elasticsearch查询以及聚合查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、条件查询 bool

must:返回的文档必须满足子句的条件,并且参与计算分值
filter:返回的文档必须满足filter子句的条件,不会参与计算分值
should:返回的文档可能满足should子句的条件。
must_nout:返回的文档必须不满足must_not定义的条件。
注意:如果一个查询既有filter又有should,那么至少包含一个should子句。

bool 查询

user 值为kimchy tag 值为tech

"query": {
   "bool" : {
        "must" : {
            "term" : { "user" : "kimchy" }
        },
        "filter": {
            "term" : { "tag" : "tech" }
        },
        "must_not" : {
            "range" : {
                "age" : { "from" : 10, "to" : 20 }
            }
        },
        "should" : [
            {"term" : { "tag" : "wow" }},
            {"term" : { "tag" : "elasticsearch" }}
        ]
    }

过滤不存在数据

"query": {
        "bool":{
            "filter":{
                "exists":{
                    "field":"subject" }
            }
        }   
    }

统计某个字段出现的次数

size 0 不需要返回文档数据,只需要值

  "size": 0,
   "query": {
        "bool":{
            "filter":{
                "exists":{
                    "field":"proofreadresult" }
            }
        }   
    }

返回 某个字段 ischeck值为false 的数量

"size": 0,
   "query": {
        "bool":{
            "must": [{"match": {"ischeck": "false"}}],
        }   
    }
}

"size": 0,
   "query": {
        "bool":{
            "must":  {"term" : { "ischeck" : "false" }}
        }   
    }
}

返回的数据 value 就是我们需要的数据

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3476,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

2、字段过滤
过滤字段不存在的数据,filter + exists

使用 exists 进行过滤掉字段不存在的数据

 "size": 0, 
 "query": {
        "bool":{
            "filter":{"exists":{"field":"subject" }},
             "must": [{"range": {"createtime": {
                      "gte": 1654012800000,
                      "lte": 1655308799000}}
                     }]
         }   
 }

3、聚合查询
1)分组 https://blog.csdn.net/cainiao1412/article/details/120876972
聚合分组查询,使用terms,按照某个字段中的值来分类,通过size的值来确定返回文档的数量,如果不指定值,默认返回10个
Es query 中,使用 term 进行精准查询,不会对字段进行分词,
使用terms,进行多个条件查询,类似 in

使用 script 进行多个字段 分组的实现,通过需要自己进行split处理

对uid进行分组

 "aggs": {
        "result": {
            "terms": {
                "field": "uid",
                "size": 2147483647
            } 
        }
  }

对 uid+subject 进行分组 通过 size 指定大小

"aggs": {
        "result": {
            "terms": {
                "script": { "inline": "doc['uid'].value +'-'+ doc['subject'].value"},
                "size": 40
            }
        }
  }

2)聚合查询先进行过滤,然后分组

size 表示query返回的数据

subject 存在的数据中 按照 uid-subject 分组数据

  "size": 0,
  "aggs": {
    "filer-subject" : {
      "filter": {
        "bool" : {
          "filter" : [
            {"exists":{"field":"subject"}}
          ]
        }
      },
      "aggs": {
        "result" : {
            "terms": {
                "script": { "inline": "doc['uid'].value +'-'+ doc['subject'].value"},
                "size": 40
            } 
        }
      }
    }
  }
``

  # 返回的数据
  

```bash
 "aggregations" : {
    "filer-subject" : {
      "doc_count" : 3557,
      "result" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 988,
        "buckets" : [
          {
            "key" : "209372605317121-102",
            "doc_count" : 794
          },
          {
            "key" : "222580707950593-302",
            "doc_count" : 447
          },
          {
            "key" : "212246483697665-102",
            "doc_count" : 374
          },
          {
            "key" : "207843605348353-102",
            "doc_count" : 328
          }]
}}

对应的java代码

Script script = new Script(ScriptType.INLINE,Script.DEFAULT_SCRIPT_LANG , "doc['uid'].value+'-'+doc['subject'].value", new HashMap<>());
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("result").script(script).size(ESCommonConstant.ES_GROUP_QUERY_SIZE);
        // search
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.aggregation(aggregationBuilder);
        // query
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        List<QueryBuilder> must = boolQueryBuilder.must();

        if(Objects.nonNull(requestDWDProofreadRecordDTO.getStartTime()) && Objects.nonNull(requestDWDProofreadRecordDTO.getEndTime())){
             must.add(QueryBuilders.rangeQuery(ProofreadDetailConstant.CREATETIME).from(requestDWDProofreadRecordDTO.getStartTime()).to(requestDWDProofreadRecordDTO.getEndTime()));
        }
        must.add(QueryBuilders.boolQuery().must((QueryBuilders.existsQuery("subject"))));

        searchSourceBuilder.query(boolQueryBuilder);
        searchSourceBuilder.size(0);

3)聚合多条件查询,并按指定的文档返回想要的数据

"size": 0,
  "aggs": {
  # 该数据是  条件 ischeck 值为true,subject 存在,
  # 分组 combinequestiontype分组返回总数量
    "ischeck-count" : {
      "filter": {
        "bool" : {
          "filter" : [
            {"exists":{"field":"subject"}} 
          ],
          "must" : {"term" : {"ischeck" : "true"} }  
        } 
      },
      "aggs": {
        "result" : {
            "terms": {
                "field": "combinequestiontype",
                "size": 30
            } 
        }
        
      }
    },

  # 该数据是 条件 proofreadresult存在,
  # 分组 combinequestiontype分组返回总数
  "proofreadresult-count" : {
      "filter": {
        "bool" : {
          "filter" : [
            {"exists":{"field":"proofreadresult"}} 
          ] 
        } 
      },
      "aggs": {
        "result" : {
            "terms": {
                "field": "combinequestiontype",
                "size": 30
            } 
        }
        
      }
    },
    

  # 该数据是 返回 isCheck 的数量
  "ischeck_total": {
        "terms": {
          "field": "ischeck"
        }
     },
 
   # 该数据是 返回 proofreadresult 字段存在 的数量
   # 即就是 proofreadresult  不为空的数量
 "proofreadresult_total": {
        "filter": {
              "bool" : {
                "filter" : [
                    {"exists":{"field":"proofreadresult"}} 
                  ] 
              } 
        }
     }
  }

对应的java代码

// ischeck-count
        FilterAggregationBuilder ischeckCount = AggregationBuilders.filter("ischeck-count", QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("ischeck", true))
                .must(QueryBuilders.termQuery("uid", uid))
                .filter(QueryBuilders.existsQuery("xxx")))
                .subAggregation(AggregationBuilders.terms("result").field("xxx").size(30));

        // proofreadresult-count
        FilterAggregationBuilder proofreadCount = AggregationBuilders.filter("ischeck-count", QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("ischeck", true))
                .must(QueryBuilders.termQuery("uid", uid))
                .filter(QueryBuilders.existsQuery("xxx")));

        searchSourceBuilder.aggregation(ischeckCount);

// 结果处理
List list = new ArrayList<>();
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms oneTerm = (Terms) response.getAggregations().asMap().get(“result”);
for (Terms.Bucket bucket : oneTerm.getBuckets()) {
ProofreadDetailDTO proofreadDetailDTO = new ProofreadDetailDTO();
// 此处自己split分隔处理
String[] strings = bucket.getKey().toString().split(“-”);
proofreadDetailDTO.setUid(Long.parseLong(strings[0]));
proofreadDetailDTO.setSubject(Integer.parseInt(strings[1]));
list.add(proofreadDetailDTO);
}文章来源地址https://www.toymoban.com/news/detail-411885.html

到了这里,关于Elasticsearch查询以及聚合查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL-条件查询与聚合函数的使用

     🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页: 小小恶斯法克的博客 🎈该系列文章专栏: 重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏 📜 感谢大家的关注! ❤️ 目录 DQL-条件查询 1.语法

    2024年01月23日
    浏览(33)
  • MySQL学习笔记3——条件查询和聚合函数

    WHERE 和 HAVING 的区别: WHERE是直接对表中的字段进行限定,来筛选结果; HAVING则需要跟分组GROUP BY一起使用,通过对分组字段或分组计算函数进行限定,来筛选结果。 虽然它们都是对查询进行限定,却有着各自的特点和适用场景。 WHERE WHERE的特点是,直接用表的

    2024年04月16日
    浏览(24)
  • Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合函数的使用、Lambda条件查询

    学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 普通查询 条件构造器查询 【重要】 AbstractWrapper  是 MyBatis Plus 中的一个抽象类,用于构建 SQL 查询条件。定义了泛型  T 、 C  和  Children 。其中, T  表示实体类的类型, C  表示查

    2024年02月04日
    浏览(44)
  • 【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

    在上次学习的内容中,我们讲解了: 使用DDL语句来操作数据库以及表结构(数据库设计) 使用DML语句来完成数据库中数据的增、删、改操作(数据库操作) 我们今天还是继续学习数据库操作方面的内容:查询(DQL语句)。 查询操作我们分为两部分学习: DQL语句-单表操作

    2024年02月02日
    浏览(67)
  • Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

    DQL:数据查询语言; 用来对表内的数据进行查找 。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。  可以发现name字段就只剩下一个张三了;   条件: 条件查询—比较运算符 比较运算符 功能 大于 = 大于等于 小于 = 小于等

    2024年01月19日
    浏览(45)
  • Elasticsearch学习-- 聚合查询

     1. 分桶聚合  bucket aggregations 按照每个标签进行分类 ,类似于group by        2. 指标聚合 metrics aggregations   3. 管道聚合 pipeline aggregations 先计算平均值,再计算最小值    默认查询返回结果是10条,可以通过设置size来看返回值数量 1. 统计不同标签的商品数量   2. 为什么上面使

    2023年04月09日
    浏览(28)
  • elasticsearch聚合查询实践

    概念 聚合分类 聚合语法 聚合作用范围及排序 聚合原理及 terms 精准度 聚合实验 桶聚合 指标聚合 Pipeline 聚合 实践一:多商户数据权限聚合分页 实践二:多维度嵌套聚合 实践三:删除 ES 索引重复数据 附:实验环境 用于聚合的字段必须是 exact value ,即 doc_value=true 。分词字

    2024年02月03日
    浏览(40)
  • elasticsearch的聚合查询

    聚合基本格式 其中NAME表示当前聚合的名字,可以取任意合法的字符串,AGG_TYPE表示聚合的类型,常见的为分为多值聚合和单值聚合 例子 上面的例子表示查询当前库里面的likeCount的和,返回结果: 返回结果中默认会包含命中的document,所以需要把size指定为0,结果中的sum_all为

    2024年02月08日
    浏览(37)
  • 重学Elasticsearch第5章 : 过滤查询、聚合查询

    其实准确来说,ES中的查询操作分为2种: 查询(query) 和 过滤(filter) 。 查询即是之前提到的query查询,它(查询)默认会计算每个返回文档的得分,然后根据得分排序 。 过滤(filter)只会筛选出符合的文档,并不计算得分,且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快

    2024年02月09日
    浏览(28)
  • 一起学Elasticsearch系列-聚合查询

    本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 聚合查询是 Elasticsearch 中一种强大的数据分析工具,用于从索引中提取和计算有关数据的统计信息。聚合查询可以执行各种聚合操作,如计数、求和、平均值、最小值、最大值、分组等,以便进行数据汇总和

    2024年01月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包