有一个索引,存储任务要做,在它有一个用户ID,任务ID和里面有嵌套的数据,用于存储一个计时器,用户开始和完成工作的任务。
我在Elasticsearch 6中使用了一个脚本,它搜索特定时间段内的任务和计时器,该脚本只返回与该时间匹配的计时器。
然而,我最近迁移到了Elasticsearch 8,脚本不像以前那样工作了,现在它返回了所有在该时间段内有计时器的任务,但我并没有将其限制为该时间段内的计时器。
任务会正确返回,但其中的所有计时器也会正确返回。
如何让脚本只返回与过滤器匹配的计时器?
脚本:
{
"size": 1024,
"track_total_hits": true,
"query": {
"bool": {
"must": [
{
"term": {
"user_id": 123
}
},
{
"nested": {
"path": "timer.content",
"query": {
"bool": {
"must": {
"range": {
"timer.content.start_work": {
"gte": "2023-08-26T00:00:00-0300",
"lte": "2023-09-26T23:59:59-0300"
}
}
}
}
}
}
},
{
"terms": {
"user_status": [
"E",
"I"
]
}
}
]
}
},
"sort": {
"task_id": {
"order": "desc"
}
},
"_source": []
}
索引结构:
{
"settings": {
"analysis": {
"analyzer": {
"ignoreaccents": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"properties": {
"task_id": {
"type": "long"
},
"user_id": {
"type": "long",
"index": true
},
"user_status": {
"type": "keyword",
"index": true
},
"timer": {
"type": "object",
"properties": {
"content": {
"type": "nested",
"properties": {
"timer_id": {
"type": "long",
"index": true
},
"task_id": {
"type": "long",
"index": true
},
"user_id": {
"type": "long",
"index": true
},
"start_work": {
"type": "date",
"index": true,
"format": "strict_date_time_no_millis"
},
"end_work": {
"type": "date",
"index": true,
"format": "strict_date_time_no_millis"
}
}
}
}
}
}
}
}
1条答案
按热度按时间bksxznpy1#
您需要将
inner_hits
添加到嵌套查询中,您还可以选择在_source
参数选项中使用excludes
排除time.content。下面是一个例子: