我正在" 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" }
答案 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
}
}
]
}
}
}
}
}