弹性搜索过滤器存储桶值

时间:2019-05-18 02:26:20

标签: java database elasticsearch nosql backend

我的用例如下,我需要找出在过去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中的字词查询来获取此信息。

1 个答案:

答案 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"
            }
          }
        }
      }
    }
  }
}