ElasticSearch的Script逻辑查询

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

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

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

ES 语句

{
"query": {
	"bool": {
		"filter": [{
			"range": {
				"datetime": {
					"from": "2019-10-01 00:00:00",
					"to": "2019-11-01 12:00:00",
					"include_lower": true,
					"include_upper": true,
					"boost": 1.0
				}
			}
		}, {
			"script": {
				"script": {
					"source": "(doc['datetime'].value.hourOfDay)>=17",
					"lang": "painless"
				},
				"boost": 1.0
			}
		}, {
			"script": {
				"script": {
					"source": "(doc['datetime'].value.hourOfDay)<19",
					"lang": "painless"
				},
				"boost": 1.0
			}
		}, {
			"exists": {
				"field": "linkdirname",
				"boost": 1.0
			}
		}],
		"adjust_pure_negative": true,
		"boost": 1.0
	}
},
"sort": [{
	"datetime": {
		"order": "desc"
	}
}],
"aggregations": {
	"sum_volume": {
		"sum": {
			"field": "volume"
		}
	}
}
/**
 * 计算早晚高峰流量
 * @param startDate
 * @param endDate
 * @param volume_max
 * @param startHour
 * @param endHour
 * @param sumId
 * @return
 */
private int computeMorningAndEveningPeak(String startDate, String endDate, SumAggregationBuilder volume_max,
                                         int startHour, int endHour, String sumId, String comField) throws ParseException {
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    boolQueryBuilder.filter(QueryBuilders.rangeQuery("datetime").gte(startDate).lte(endDate));
    boolQueryBuilder.filter(QueryBuilders.scriptQuery(new Script("(doc['datetime'].value.hourOfDay)>=" + startHour)));
    boolQueryBuilder.filter(QueryBuilders.scriptQuery(new Script("(doc['datetime'].value.hourOfDay)<" + endHour)));

    boolQueryBuilder.filter(QueryBuilders.existsQuery(comField));
    sourceBuilder.query(boolQueryBuilder);
    sourceBuilder.aggregation(volume_max).sort("datetime", SortOrder.DESC);
    // 查询ES
    SearchResponse response = ElasticsearchUtil.search(restHighLevelClient, sourceBuilder, ES_FLOW_5MIN, ES_DATA);
    return getSumFlowByResponse(response, sumId);
}

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

mills
Chronology
Zone
ZoneRetainFields
Year
Weekyear
MonthOfYear
WeekOfWeekyear
DayOfYear
DayOfMonth
DayOfWeek
HourOfDay
MinuteOfHour
SecondOfDay
SecondOfMinute
MillisOfDay
MillisOfSecond


 

以下是 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、付费专栏及课程。

余额充值