首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch:两个字段范围查询

Elasticsearch:两个字段范围查询
EN

Stack Overflow用户
提问于 2015-12-01 18:25:10
回答 1查看 986关注 0票数 0

我有一系列的范围,比如1-5,6-10,11-15。我要找的是,每个范围的,记录其“开始”字段位于范围中的第一个元素之前,而其"end“字段位于范围中的第二个元素之后。

使用elasticsearch,我可以通过以下查询来完成单个范围的任务:

代码语言:javascript
复制
GET my_index/_search
    {
      "size": 0,
      "query": {
        "filtered": {
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "end": {
                      "gte": 5
                    }
                  }
                },
                {
                  "range": {
                    "start": {
                      "lte": 1
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "aggs": {
        "value": {
          "terms": {
            "field": "value",
            "size": 100
          }
        }
      }
    }

如何在一个查询中使用多个范围来完成这一任务?

在伪代码中,

代码语言:javascript
复制
 for each range: 
   must:
      start < range[0],
      end > range[1]

测试数据:

代码语言:javascript
复制
PUT /test_index
{"settings": {"number_of_shards": 1}}

POST /test_index/doc/_bulk
{"index":{"_id":1}}
{"start":0, "end":10, "value":2}
{"index":{"_id":2}}
{"start":0, "end":12, "value":1}
{"index":{"_id":3}}
{"start":2, "end":11, "value":2}
{"index":{"_id":4}}
{"start":11, "end":13, "value":3}

预期产出:

代码语言:javascript
复制
{
   ...
   "aggregations": {
      "my_ranges": {
         "buckets": [
            {
               "key": "1-5", # i.e. range 1-5
               "doc_count": 2,
               "value": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": "2",
                        "doc_count": 1
                     },
                     {
                        "key": "1",
                        "doc_count": 1
                     }
                  ]
               }
            },
            {
               "key": "6-10", # i.e. range 6-10
               "doc_count": 1,
               "value": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": "2",
                        "doc_count": 1
                     }
                  ]
               }
            }
         ]
      }
   }
EN

回答 1

Stack Overflow用户

发布于 2015-12-01 18:46:18

如果我正确地获得了您的需求,并且假设您的范围字段是integer,那么直方图聚合就可以了。尝尝这个

代码语言:javascript
复制
   {
      "aggs": {
        "ranges": {
          "histogram": {
            "field": "range",
            "interval": 5
          },
          "aggs": {
            "values": {
              "terms": {
                "field": "value",
                "size": 100
              }
            }
          }
        }
      },
      "size": 0
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34027415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档