一、题目
在集群上有索引 task,请编写查询并满足要求:
定义一个名为field_num 的运行时字段,实现以下聚合(a字段的值等于field_x字段减去field_y字段),field_num 聚合区间如下:
- 聚合值小于0的文档
- 聚合0到100之间的文档
- 聚合大于100的文档
二、思考
1)运行时字段第一反应runtime filed,运行时字段有两种类型一个是mapping中的,一个是查询中的,通过审题好像没有限定,所以两种应该都可以。
2)聚合使用的agg,这里要求有区间所以应该是range
三、解题
索引准备工作
# DELETE task
PUT task
{
"mappings": {
"properties": {
"field_x": {
"type": "integer"
},
"field_y": {
"type": "integer"
}
}
}
}
PUT task/_bulk
{"create":{"_id":"1"}}
{"field_x":1,"field_y":100}
{"create":{"_id":"2"}}
{"field_x":100,"field_y":10}
{"create":{"_id":"3"}}
{"field_x":190,"field_y":10}
{"create":{"_id":"4"}}
{"field_x":33,"field_y":10}
{"create":{"_id":"5"}}
{"field_x":100,"field_y":210}
方案一:mapping 中配置runtime field
Step 1、创建mapping 指定runtime字段
注意:
- mappings下面 运行时字段为 runtime,不是runtime_mappings
- emit 方法返回值是数值类型,type为long,不能为integer
- 脚本中获取字段值使用doc['xx'].value
# DELETE task
PUT task
{
"mappings": {
"runtime": {
"field_num": {
"type": "long",
"script": {
"source": """
emit(doc['field_x'].value - doc['field_y'].value)
"""
}
}
},
"properties": {
"field_x": {
"type": "integer"
},
"field_y": {
"type": "integer"
}
}
}
}
Step 2、创建查询语句
注意:
- 运行时字段不在_source下,如果需要查看字段需要将fields设置为["*"]
- range要通过filed指定要聚合的字段名,如果为"",不会报错,但聚合的结果值是都是0
POST task/_search
{
"size": 0,
"fields": [
"*"
],
"aggs": {
"range_num": {
"range": {
"field": "field_num",
"ranges": [
{
"to": 0
},
{
"from": 0,
"to": 100
},
{
"from": 100
}
]
}
}
}
}
方案二:在查询语句中使用runtime field
注意:
- query 下面运行时字段为 runtime_mappings,要和mapping下的 runtime 区别开
- emit 方法返回值是数值类型,type为long,不能为integer
- 脚本中获取字段值使用doc['xx'].value
POST task/_search
{
"size": 0,
"fields": [
"*"
],
"runtime_mappings": {
"field_num": {
"type": "long",
"script": {
"source": """
emit(doc['field_x'].value - doc['field_y'].value)
"""
}
}
},
"aggs": {
"range_num": {
"range": {
"field": "field_num",
"ranges": [
{
"to": 0
},
{
"from": 0,
"to": 100
},
{
"from": 100
}
]
}
}
}
}
四、总结
1、runtime filed主要由两种形式,注意相应格式mapping中的为runtime,query中的runtime_mappings
2、在实际工程使用中不建议使用runtime_filed,因为会影响查询性能,建议预先将逻辑处理好写入索引字段,然后直接查询
参考资料
- Map a runtime field | Elasticsearch Guide [8.15] | Elastic
- Define runtime fields in a search request | Elasticsearch Guide [8.15] | Elastic
- Range aggregation | Elasticsearch Guide [8.15] | Elastic
送一波福利:
标签:runtime,--,task,field,num,ElasticSearch,100,Runtime,type From: https://blog.csdn.net/hengzhepa/article/details/141791423