我的用例如下,我需要找出在过去1年中出现但在过去3个月中消失的所有独特颜色。所以我的文件看起来像这样
{
doc_id: 1,
color: "red",
timestamp: epoch time here
},
{
doc_id: 2,
color: "blue",
timestamp: epoch time here
}
因此,例如,如果去年有任何具有属性颜色(从现在开始简称为颜色)为蓝色的文档,但在最近3个月内没有出现,则我们需要在结果中包括蓝色。另一方面,如果去年出现了红色文档,而最近三个月也出现了红色文档,那么我们需要从结果中排除红色。
上例中的1年还包括3个月的计算时间。因此,如果所有带有蓝色的文档仅在2018年5月至2019年2月之间发生,这意味着带有蓝色的文档发生于去年,但在最近3个月内(2019年3月至2019年5月)丢失了,那么蓝色应该在结果集中。另一方面,如果带有红色的文档发生在2018年5月-2019年2月以及2019年3月-2019年5月之间,那么我们需要在结果集中排除这个红色。我无法通过Elastic search中的字词查询来获取此信息。
答案 0 :(得分:1)
我的取值范围是“ 2019-01-01”-“ 2019-12-30”,排除月份为“ 2019-09-01”-“ 2019-12-30”
Mapping :
{
"testindex" : {
"mappings" : {
"properties" : {
"color" : {
"type" : "keyword"
},
"doc_id" : {
"type" : "long"
},
"timestamp" : {
"type" : "date"
}
}
}
}
}
数据:
"hits" : [
{
"_index" : "testindex",
"_type" : "_doc",
"_id" : "GPv0zWoB8AL5aj8D_wLG",
"_score" : 1.0,
"_source" : {
"doc_id" : 1,
"color" : "blue",
"timestamp" : "2019-03-30"
}
},
{
"_index" : "testindex",
"_type" : "_doc",
"_id" : "Gfv1zWoB8AL5aj8DJAKU",
"_score" : 1.0,
"_source" : {
"doc_id" : 1,
"color" : "red",
"timestamp" : "2019-12-30"
}
},
{
"_index" : "testindex",
"_type" : "_doc",
"_id" : "Gvv1zWoB8AL5aj8DOwKf",
"_score" : 1.0,
"_source" : {
"doc_id" : 1,
"color" : "red",
"timestamp" : "2019-01-01"
}
}
]
}
最终查询:
GET testindex/_search
{
"size": 0,
"query": {
"range": {
"timestamp": {
"gte": "2019-01-01",
"lte": "2019-12-30"
}
}
},
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"excluded_range": {
"date_range": {
"field": "timestamp",
"ranges": [
{
"from": "2019-09-01",
"to": "2019-12-31"
}
]
}
},
"excluded_docs_count": {
"sum_bucket": {
"buckets_path": "excluded_range>_count"
}
},
"myfinal": {
"bucket_selector": {
"buckets_path": {
"out_of_range_docs": "excluded_docs_count"
},
"script": {
"inline": "params.out_of_range_docs==0"
}
}
}
}
}
}
}