范围0计算ElasticSearch中聚合中的术语

时间:2015-10-02 16:08:38

标签: lucene elasticsearch

我正在" location"进行聚合。我的文件中的字段,其中还有一个" city"同一文档中的字段。我在城市字段上查询文档并在位置字段上汇总文档。

{
  "aggs": {
    "locations": {
      "terms": {
        "field": "location",
        "min_doc_count": 0
      }
    }
  },
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "city": "mumbai",
                "_cache": true
              }
            }
          ]
        }
      }
    }
  }
}

现在计数和聚合都很顺利,而且还有点击率。但我的问题是我想要与' doc-count'进行聚合。设置为0,聚合桶返回所有l计数,其中0计数甚至落在其他城市。我想只获得该城市的0个计数位置。想要将0计数位置的上下文范围限定为城市。 我尝试通过嵌套聚合在嵌套城市中放置位置然后执行aggs,或者将过滤器aggs与术语agg结合但仍然得到相同的结果来实现这一点。有任何方法可以实现这一点,或者弹性搜索本身就是这样工作的。 ES版本 - 1.6

我的映射如下所示:

{
  "service": {
    "_source": {
      "enabled": true
    },
    "properties": {
      "name": {
        "type": "string",
        "index": "not_analyzed"
      },
      "location": {
        "type": "string",
        "index": "not_analyzed"
      },
      "city": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

索引的样本文档

{   " name":" a",   " location":" x",   " city":" mumbai" }

{   " name":" b",   " location":" x",   " city":" mumbai" }

{   " name":" c",   " location":" y"   " city":" chennai" }

1 个答案:

答案 0 :(得分:1)

您应该尝试按递增的文档计数对terms聚合(嵌入到filter聚合中)进行排序,然后您将获得所有带有0 doc count的条款。请注意,默认情况下,您只会获得前10个术语,如果您的术语数少于0个,则会全部看到,否则您可能需要将size参数增加到高于10的值

{
  "aggs": {
    "city_filter": {
      "filter": {
        "term": {
          "city": "mumbai"
        }
      },
      "aggs": {
        "locations": {
          "terms": {
            "field": "location",
            "min_doc_count": 0,
            "size": 20,         <----- add this if you have more than ten 0-doc-count terms
            "order": {          <----- add this to see 0-doc-count first
              "_count": "asc"
            }
          }
        }
      }
    }
  },
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "city": "mumbai",
                "_cache": true
              }
            }
          ]
        }
      }
    }
  }
}