• ES filter查询 高亮查询 聚合查询


    filter查询

    query,根据你的查询条件,去计算文档的匹配度得到一个分数,并且根据分数进行排序,不会做缓存的。

    filter,根据你的查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存。

     

    1. # filter查询
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "filter": [
    7. {
    8. "term": {
    9. "corpName": "盒马鲜生"
    10. }
    11. },
    12. {
    13. "range": {
    14. "fee": {
    15. "lte": 4
    16. }
    17. }
    18. }
    19. ]
    20. }
    21. }
    22. }
    1. // Java实现filter操作
    2. @Test
    3. public void filter() throws IOException {
    4. //1. SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 查询条件
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    10. boolQuery.filter(QueryBuilders.termQuery("corpName","盒马鲜生"));
    11. boolQuery.filter(QueryBuilders.rangeQuery("fee").lte(5));
    12. builder.query(boolQuery);
    13. request.source(builder);
    14. //3. 执行查询
    15. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    16. //4. 输出结果
    17. for (SearchHit hit : resp.getHits().getHits()) {
    18. System.out.println(hit.getSourceAsMap());
    19. }
    20. }

    高亮查询

    高亮查询就是你用户输入的关键字,以一定的特殊样式展示给用户,让用户知道为什么这个结果被检索出来。

    高亮展示的数据,本身就是文档中的一个Field,单独将Field以highlight的形式返回给你。

    ES提供了一个highlight属性,和query同级别的。

    • fragment_size:指定高亮数据展示多少个字符回来。

    • pre_tags:指定前缀标签,举个栗子< font color="red" >

    • post_tags:指定后缀标签,举个栗子< /font >

    • fields:指定哪几个Field以高亮形式返回

    RESTful实现  

    1. # highlight查询
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "query": {
    5. "match": {
    6. "smsContent": "盒马"
    7. }
    8. },
    9. "highlight": {
    10. "fields": {
    11. "smsContent": {}
    12. },
    13. "pre_tags": "",
    14. "post_tags": "",
    15. "fragment_size": 10
    16. }
    17. }

    1. / Java实现高亮查询
    2. @Test
    3. public void highLightQuery() throws IOException {
    4. //1. SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 指定查询条件(高亮)
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. //2.1 指定查询条件
    10. builder.query(QueryBuilders.matchQuery("smsContent","盒马"));
    11. //2.2 指定高亮
    12. HighlightBuilder highlightBuilder = new HighlightBuilder();
    13. highlightBuilder.field("smsContent",10)
    14. .preTags("")
    15. .postTags("");
    16. builder.highlighter(highlightBuilder);
    17. request.source(builder);
    18. //3. 执行查询
    19. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    20. //4. 获取高亮数据,输出
    21. for (SearchHit hit : resp.getHits().getHits()) {
    22. System.out.println(hit.getHighlightFields().get("smsContent"));
    23. }
    24. }

     

     

    聚合查询

    ES的聚合查询和MySQL的聚合查询类似,ES的聚合查询相比MySQL要强大的多,ES提供的统计数据的方式多种多样。

    下图名字可以随便起

    1. # ES聚合查询的RESTful语法
    2. POST /index/type/_search
    3. {
    4. "aggs": {
    5. "名字(agg)": {
    6. "agg_type": {
    7. "属性": "值"
    8. }
    9. }
    10. }
    11. }

     

    去重计数查询

    去重计数,即Cardinality,第一步先将返回的文档中的一个指定的field进行去重,统计一共有多少条

    1. # 去重计数查询 北京 上海 武汉 山西
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "aggs": {
    5. "agg": {
    6. "cardinality": {
    7. "field": "province"
    8. }
    9. }
    10. }
    11. }

     

     

    1. // Java代码实现去重计数查询
    2. @Test
    3. public void cardinality() throws IOException {
    4. //1. 创建SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 指定使用的聚合查询方式
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. builder.aggregation(AggregationBuilders.cardinality("agg").field("province"));
    10. request.source(builder);
    11. //3. 执行查询
    12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    13. //4. 获取返回结果
    14. Cardinality agg = resp.getAggregations().get("agg");
    15. long value = agg.getValue();
    16. System.out.println(value);
    17. }

     

    范围统计

    统计一定范围内出现的文档个数,比如,针对某一个Field的值在 0~100,100~200,200~300之间文档出现的个数分别是多少。

    范围统计可以针对普通的数值,针对时间类型,针对ip类型都可以做相应的统计。

    range,date_range,ip_range

    数值统计

    1. # 数值方式范围统计
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "aggs": {
    5. "agg": {
    6. "range": {
    7. "field": "fee",
    8. "ranges": [
    9. {
    10. "to": 5
    11. },
    12. {
    13. "from": 5, # from有包含当前值的意思
    14. "to": 10
    15. },
    16. {
    17. "from": 10
    18. }
    19. ]
    20. }
    21. }
    22. }
    23. }

     

    1. # 时间方式范围统计
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "aggs": {
    5. "agg": {
    6. "date_range": {
    7. "field": "createDate",
    8. "format": "yyyy",
    9. "ranges": [
    10. {
    11. "to": 2000
    12. },
    13. {
    14. "from": 2000
    15. }
    16. ]
    17. }
    18. }
    19. }
    20. }
    1. # ip方式 范围统计
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "aggs": {
    5. "agg": {
    6. "ip_range": {
    7. "field": "ipAddr",
    8. "ranges": [
    9. {
    10. "to": "10.126.2.9"
    11. },
    12. {
    13. "from": "10.126.2.9"
    14. }
    15. ]
    16. }
    17. }
    18. }
    19. }

    from表示包含当前值得意思   上图表示0-5 ,5-10 (包含5不含10),10以上(包含10)

    1. // Java实现数值 范围统计
    2. @Test
    3. public void range() throws IOException {
    4. //1. 创建SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 指定使用的聚合查询方式
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. //---------------------------------------------
    10. builder.aggregation(AggregationBuilders.range("agg").field("fee")
    11. .addUnboundedTo(5)
    12. .addRange(5,10)
    13. .addUnboundedFrom(10));
    14. //---------------------------------------------
    15. request.source(builder);
    16. //3. 执行查询
    17. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    18. //4. 获取返回结果
    19. Range agg = resp.getAggregations().get("agg");
    20. for (Range.Bucket bucket : agg.getBuckets()) {
    21. String key = bucket.getKeyAsString();
    22. Object from = bucket.getFrom();
    23. Object to = bucket.getTo();
    24. long docCount = bucket.getDocCount();
    25. System.out.println(String.format("key:%s,from:%s,to:%s,docCount:%s",key,from,to,docCount));
    26. }
    27. }

     

    统计聚合查询

    他可以帮你查询指定Field的最大值,最小值,平均值,平方和等

    使用:extended_stats

    1. # 统计聚合查询
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "aggs": {
    5. "agg": {
    6. "extended_stats": {
    7. "field": "fee"
    8. }
    9. }
    10. }
    11. }

     

     

    1. // Java实现统计聚合查询
    2. @Test
    3. public void extendedStats() throws IOException {
    4. //1. 创建SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 指定使用的聚合查询方式
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. //---------------------------------------------
    10. builder.aggregation(AggregationBuilders.extendedStats("agg").field("fee"));
    11. //---------------------------------------------
    12. request.source(builder);
    13. //3. 执行查询
    14. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    15. //4. 获取返回结果
    16. ExtendedStats agg = resp.getAggregations().get("agg");
    17. double max = agg.getMax();
    18. double min = agg.getMin();
    19. System.out.println("fee的最大值为:" + max + ",最小值为:" + min);
    20. }

  • 相关阅读:
    dev C++5.11的使用技巧:调试、快捷键等(备战蓝桥杯)
    JavaCV开发详解之1:调用本机摄像头并预览摄像头图像画面视频(建议使用javaCV最新版本)
    Stretched mesh
    【PyTorch】PyTorch基础知识——张量
    统计二进制中1的个数
    VXLAN基础
    软件安全需求分析
    vscode软件安装包下载安装教程
    分享一个springboot+uniapp开发的线上马拉松报名小程序源码 lw 调试
    Java 异常处理
  • 原文地址:https://blog.csdn.net/weixin_60934893/article/details/128047230