当前位置:   article > 正文

elasticsearch 查询聚合操作_elasticsearch聚合查询

elasticsearch聚合查询

一、es相关查询

1、多维度查询 关键词:bool must match

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "match":{"server_name":"www.test.com"}
  7. },
  8. {
  9. "match":{"status":"404"}
  10. }
  11. ]
  12. }
  13. }
  14. }

2、模糊查询 关键词:wildcard

匹配出状态码status 以 5 开头的日志

  1. {
  2. "query": {
  3. "wildcard": {"status": "5*"}
  4. }
  5. }

3、指定某个值 同时匹配多个字段 关键词:multi_match

query 要查询的值
fields 要匹配的字段【数组】
匹配出 字段code和status 为400的所有日志

  1. {
  2. "query": {
  3. "multi_match": {
  4. "query": "400",
  5. "fields": [ "code", "status" ]
  6. }
  7. }
  8. }

4、一个字段查询多个值

关键词:terms
{ “字段”:[ 要匹配的多个值 ] }

  1. {
  2. "query": {
  3. "terms": {
  4. "status": ["400","402","406"]
  5. }
  6. }
  7. }

5、多种组合查询

关键词:bool must should range size sort

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "bool":{
  7. "should":[
  8. {"wildcard": {"status": "5*"}},
  9. {"terms": {"status": ["400","402","406"]}}
  10. ]
  11. }
  12. },
  13. {
  14. "range": {
  15. "time": {"gte": "2022-05-22T12:34:00.000+0800",
  16. "lte": "2022-05-22T12:34:01.000+0800"}
  17. }
  18. }
  19. ]
  20. }
  21. },
  22. "size":100,
  23. "sort": [
  24. {
  25. "time": {
  26. "order": "desc"
  27. }
  28. }
  29. ]
  30. }

6、es默认时间格式查询/ java时间查询

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "range": {
  7. "createTime": {
  8. "gte": "2022-05-22T12:34:00.000+0800",
  9. "lte": "2022-05-22T12:34:01.000+0800"
  10. }
  11. }
  12. }
  13. ]
  14. }
  15. },
  16. "size":20
  17. }
  18. java 查询时:
  19. 实体字段添加: @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
  20. 代码中转换格式:SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
  21. 新建es格式化date"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

7、单字段排序

  1. {
  2. "sort": {
  3. "createTime": {
  4. "order": "asc"
  5. }
  6. }
  7. }

8、多字段排序

  1. {
  2. "sort":[{
  3. "createTime": {
  4. "order": "asc"
  5. },
  6. "updateTime": {
  7. "order": "desc"
  8. }]
  9. }
  10. }

9、条件查询加聚合

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "range": {
  7. "createTime": {
  8. "from": "2022-05-16T00:00:00.000+0800"
  9. }
  10. }
  11. },
  12. {
  13. "match": {
  14. "tonalState": 2
  15. }
  16. }
  17. ]
  18. }
  19. },
  20. "aggs": {
  21. "brandAgg": {
  22. "terms": {
  23. "field": "mediaLink"
  24. }
  25. }
  26. },
  27. "size": 0
  28. }

10、高量查询

  1. GET /megacorp/employee/_search
  2. {
  3. "query" : {
  4. "match_phrase" : {
  5. "about" : "rock climbing"
  6. }
  7. },
  8. "highlight": {
  9. "fields" : {
  10. "about" : {}
  11. }
  12. }
  13. }

11、自定义高亮

  1. {
  2. "query": {
  3. "term": {
  4. "description": {
  5. "value": "iphone"
  6. }
  7. }
  8. },
  9. "highlight": {
  10. "post_tags": ["</span>"],
  11. "pre_tags": ["<span style='color:red'>"],
  12. "fields": {
  13. "*":{}
  14. }
  15. }
  16. }

12、聚合查询

  1. publicsentiment/_search GET
  2. {
  3. "aggs": {
  4. "mediaLink": {
  5. "terms": {
  6. "field": "mediaLink"
  7. },
  8. "aggs": {
  9. "dataExist": {
  10. "terms": {
  11. "field": "dataExist"
  12. }
  13. }
  14. }
  15. }
  16. },
  17. "size": 0
  18. }

13、查询指定字段

  1. includes:来指定想要显示的字段
  2. excludes:来指定不想要显示的字段
  3. GET /heima/_search
  4. {
  5. "_source": {
  6. "includes":["title","price"]
  7. },
  8. "query": {
  9. "term": {
  10. "price": 2699
  11. }
  12. }
  13. }

14、模糊查询(fuzzy)

  1. fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2
  2. GET /heima/_search
  3. {
  4. "query": {
  5. "fuzzy": {
  6. "title": {
  7. "value":"appla",
  8. "fuzziness":1
  9. }
  10. }
  11. }
  12. }

15、elastic的聚合

Elasticsearch中提供的划分桶的方式有很多:

1、Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
2、Histogram Aggregation:根据数值阶梯分组,与日期类似
3、Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
4、Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
综上所述,我们发现bucket aggregations 只负责对数据进行分组,并不进行计算,因此往往bucket中往往会嵌套另一种聚合:metrics aggregations即度量

比较常用的一些度量聚合方式:

1、Avg Aggregation:求平均值
2、Max Aggregation:求最大值
3、Min Aggregation:求最小值
4、Percentiles Aggregation:求百分比
5、Stats Aggregation:同时返回avg、max、min、sum、count等
6、Sum Aggregation:求和
7、Top hits Aggregation:求前几
8、Value Count Aggregation:求总数

16、指定间隔分组

interval:间隔,
min_doc_count:过滤为0的分组

  1. {
  2. "size":0,
  3. "aggs":{
  4. "price":{
  5. "histogram": {
  6. "field": "price",
  7. "interval": 5000,
  8. "min_doc_count": 1
  9. }
  10. }
  11. }
  12. }

17、elasticsearch 深分页

产生原因:from、size 两字段过大,es默认是10000
解决方式:
(1)深度分页之scroll,滚动查询、每次请求两条。可以定制 scroll = 5m意味着该窗口过期时间为5分钟。
  1. GET /student/_search?scroll=5m
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "size": 2
  7. }

后边查询的时候需要带上 _scroll_id 参数

  1. GET /_search/scroll
  2. {
  3. "scroll":"5m",
  4. "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAC0YFmllU"
  5. }
(2)search_after 使用索引全局唯一标识字段 、官方推荐使用 _uid 作为全局唯一值,但是只要能表示其唯一性就可以。
  1. GET /student/_search
  2. {
  3. "query":{
  4. "match_all": {}
  5. },
  6. "size":2,
  7. "sort":[
  8. {
  9. "uid": "desc"
  10. }
  11. ]
  12. }

下一次分页,需要将上述分页结果集的最后一条数据的值带上。

  1. GET /student/student/_search
  2. {
  3. "query":{
  4. "match_all": {}
  5. },
  6. "size":2,
  7. "search_after":[1005],
  8. "sort":[
  9. {
  10. "uid": "desc"
  11. }
  12. ]
  13. }

18、解决keyword长度报错问题**

  1. test_demo/_mapping
  2. {
  3. "properties": {
  4. "title": {
  5. "type": "keyword",
  6. "ignore_above": 51
  7. }
  8. }
  9. }
深分页对比
分页方式性能优点缺点场景
from+size灵活性好,实现简单深度分页问题数据量比较小,能容忍深度分页问题
scroll解决了深度分页问题无法反应数据的实时性(快照版本),维护成本高,需要维护一个海量数据的导出需要查询海量结果集的数据
search_after性能最好、不存在深度分页问题、能够反映数据的实时变更实现复杂,需要有一个全局唯一的字段、连续分页的实现比较复杂,因为每一次查询都需要上次查询的结果海量数据的分页

19:时间段包含查询(智能报告热榜数据查询)

  1. {
  2. "query": {
  3. "bool": {
  4. "should": [
  5. {
  6. "bool": {
  7. "should": [
  8. {
  9. "range": {
  10. "createTime": {
  11. "gte": "2024-03-19T11:42:00.000+0800",
  12. "lte": "2024-03-19T11:55:00.000+0800"
  13. }
  14. }
  15. },
  16. {
  17. "range": {
  18. "updateTime": {
  19. "gte": "2024-03-19T11:42:00.000+0800",
  20. "lte": "2024-03-19T11:55:00.000+0800"
  21. }
  22. }
  23. }
  24. ],
  25. "minimum_should_match": 1
  26. }
  27. },
  28. {
  29. "bool": {
  30. "must": [
  31. {
  32. "range": {
  33. "createTime": {
  34. "lt": "2024-03-19T11:42:00.000+0800"
  35. }
  36. }
  37. },
  38. {
  39. "range": {
  40. "updateTime": {
  41. "gt": "2024-03-19T11:55:00.000+0800"
  42. }
  43. }
  44. }
  45. ]
  46. }
  47. }
  48. ],
  49. "minimum_should_match": 1
  50. }
  51. }
  52. }

二、设置非keyword类型字段聚合(只会对新数据生效)

  1. POST /index_name/_mapping
  2. {
  3. "properties": {
  4. "testText": {
  5. "type": "text",
  6. "fielddata": true,
  7. "fields": {
  8. "subField": {
  9. "type": "keyword",
  10. "ignore_above": 256
  11. }
  12. }
  13. }
  14. }
  15. }

三、ElasticSearch Java API之高级查询(分页查询,高亮查询,正则表达式查询,聚合查询等)

参考:
ElasticSearch Java API之高级查询(分页查询,高亮查询,正则表达式查询,聚合查询等)_java es高级查询分组分页聚合查询-CSDN博客
Java 操作RestHighLevelClient查询详解-CSDN博客

四、ES优化

1、写入速度优化

1、加大 Translog Flush ,目的是降低 Iops 、 Writeblock 。
2、增加 Index Refresh 间隔,目的是减少 Segment Merge 的次数。
3、调整 Bulk 线程池和队列。
4、优化节点间的任务分布。
5、优化 Lucene 层的索引建立,目的是降低 CPU 及 IO。
6、批量写入
7、服务器磁盘读写速度提高
8、调整refresh_interval(刷新时间),默认为1s,若调大后,会消耗更大的heap内存
9、副本越多,写效率越低(index.number_of_replicas: 0)

2、大数据量的优化

(1)动态索引层面

基于模板+时间+rollover api 滚动创建索引,减少单个索引的数据量过大

(2)存储层面

冷热数据分离存储,热数据(比如最近 3 天或者一周的数据),其余为冷数据。
对于冷数据不会再写入新数据,可以考虑定期 force_merge 加 shrink 压缩操作,节省存储空间和检索效率。

(3)部署层面

结合 ES 自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力

时间聚合

  1. DateHistogramAggregationBuilder group = AggregationBuilders.dateHistogram("releaseTime")//自定义名称
  2. .dateHistogramInterval(DateHistogramInterval.DAY)//设置间隔
  3. .minDocCount(0)//返回空桶
  4. .timeZone(ZoneId.of("+08:00"))
  5. .field("releaseTime")//指定时间字段
  6. .format("dd日");//设定返回格式
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/889807
推荐阅读
相关标签
  

闽ICP备14008679号