ElasticSearch的Script逻辑查询

————————————————
版权声明:本文为CSDN博主「CTO修炼手册」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Prepared/article/details/102893852

在使用 ES 进行统计的时候,经常会用到查询某个小时的统计数据,比如统计每个小时的数据;比如计算早晚高峰的数据。

这些场景都可以使用 script 进行查询、统计。

ES 语句

 
  1. {

  2. "query": {

  3. "bool": {

  4. "filter": [{

  5. "range": {

  6. "datetime": {

  7. "from": "2019-10-01 00:00:00",

  8. "to": "2019-11-01 12:00:00",

  9. "include_lower": true,

  10. "include_upper": true,

  11. "boost": 1.0

  12. }

  13. }

  14. }, {

  15. "script": {

  16. "script": {

  17. "source": "(doc['datetime'].value.hourOfDay)>=17",

  18. "lang": "painless"

  19. },

  20. "boost": 1.0

  21. }

  22. }, {

  23. "script": {

  24. "script": {

  25. "source": "(doc['datetime'].value.hourOfDay)<19",

  26. "lang": "painless"

  27. },

  28. "boost": 1.0

  29. }

  30. }, {

  31. "exists": {

  32. "field": "linkdirname",

  33. "boost": 1.0

  34. }

  35. }],

  36. "adjust_pure_negative": true,

  37. "boost": 1.0

  38. }

  39. },

  40. "sort": [{

  41. "datetime": {

  42. "order": "desc"

  43. }

  44. }],

  45. "aggregations": {

  46. "sum_volume": {

  47. "sum": {

  48. "field": "volume"

  49. }

  50. }

  51. }

 
  1. /**

  2. * 计算早晚高峰流量

  3. * @param startDate

  4. * @param endDate

  5. * @param volume_max

  6. * @param startHour

  7. * @param endHour

  8. * @param sumId

  9. * @return

  10. */

  11. private int computeMorningAndEveningPeak(String startDate, String endDate, SumAggregationBuilder volume_max,

  12. int startHour, int endHour, String sumId, String comField) throws ParseException {

  13. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

  14. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

  15. boolQueryBuilder.filter(QueryBuilders.rangeQuery("datetime").gte(startDate).lte(endDate));

  16. boolQueryBuilder.filter(QueryBuilders.scriptQuery(new Script("(doc['datetime'].value.hourOfDay)>=" + startHour)));

  17. boolQueryBuilder.filter(QueryBuilders.scriptQuery(new Script("(doc['datetime'].value.hourOfDay)<" + endHour)));

  18. boolQueryBuilder.filter(QueryBuilders.existsQuery(comField));

  19. sourceBuilder.query(boolQueryBuilder);

  20. sourceBuilder.aggregation(volume_max).sort("datetime", SortOrder.DESC);

  21. // 查询ES

  22. SearchResponse response = ElasticsearchUtil.search(restHighLevelClient, sourceBuilder, ES_FLOW_5MIN, ES_DATA);

  23. return getSumFlowByResponse(response, sumId);

  24. }

这个属性能取哪些值,取决于 org.joda.time.MutableDateTime,有需要的可以查看源码。

 
  1. mills

  2. Chronology

  3. Zone

  4. ZoneRetainFields

  5. Year

  6. Weekyear

  7. MonthOfYear

  8. WeekOfWeekyear

  9. DayOfYear

  10. DayOfMonth

  11. DayOfWeek

  12. HourOfDay

  13. MinuteOfHour

  14. SecondOfDay

  15. SecondOfMinute

  16. MillisOfDay

  17. MillisOfSecond

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Elasticsearch 中所有的查询类型: 1. Match Query:用于匹配文本类型字段中的文本。 2. Multi-match Query:用于在多个字段中匹配文本类型字段中的文本。 3. Term Query:用于匹配非文本类型字段(如数字、布尔值等)中的确切值。 4. Terms Query:用于匹配非文本类型字段(如数字、布尔值等)中的多个确切值。 5. Range Query:用于匹配数字、日期等范围内的值。 6. Exists Query:用于匹配指定字段是否存在值。 7. Prefix Query:用于匹配以指定前缀开头的文本。 8. Wildcard Query:用于匹配包含通配符的文本。 9. Regexp Query:用于使用正则表达式匹配文本。 10. Fuzzy Query:用于匹配类似但不完全匹配的文本。 11. Type Query:用于匹配指定类型的文档。 12. Ids Query:用于根据指定的文档 ID 匹配文档。 13. Bool Query:用于组合多个查询条件,支持AND、OR、NOT等逻辑操作。 14. Boosting Query:用于根据指定的查询条件调整文档的权重。 15. Constant Score Query:用于为所有匹配的文档分配相同的分数。 16. Function Score Query:用于根据指定的函数为匹配的文档分配自定义分数。 17. Dis Max Query:用于在多个查询条件中选择最佳匹配的文档。 18. More Like This Query:用于根据文档内容查找相似的文档。 19. Nested Query:用于在嵌套对象中查询。 20. Geo Distance Query:用于查询地理坐标范围内的地点。 21. Span Term Query:用于匹配指定的单个术语。 22. Span Multi Term Query:用于匹配指定的多个术语。 23. Span First Query:用于匹配文档中的首个匹配项。 24. Span Near Query:用于匹配多个术语之间的近似距离。 25. Span Or Query:用于匹配任何指定的术语。 26. Span Not Query:用于匹配不包含指定术语的文档。 27. Script Query:用于根据指定的脚本匹配文档。 以上是 Elasticsearch 中所有的查询类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值