如何通过使用Elasticsearch聚合返回唯一文档的数量
我遇到了一个问题,elasticsearch仅通过在嵌套字段上使用术语聚合就无法返回唯一文档的数量。
这是我们的模型的一个例子:
{ ...,
"location" : [
{"city" : "new york", "state" : "ny"},
{"city" : "woodbury", "state" : "ny"},
...
],
...
}
我想在状态字段上进行汇总,但是由于“ ny”在文档中出现两次,因此该文档将在“ ny”存储桶中计数两次。
所以我想知道是否在哪里可以获取不同文档的数量。
映射:
people = { :properties => {
:location => {
:type => 'nested',
:properties => {
:city => {
:type => 'string',
:index => 'not_analyzed',
},
:state => {
:type => 'string',
:index => 'not_analyzed',
},
}
},
:last_name => {
:type => 'string',
:index => 'not_analyzed'
}
}
}
查询非常简单:
curl -XGET 'http://localhost:9200/people/_search?pretty&search_type=count' -d '{ "query" : {
"bool" : {
"must" : [
{"term" : {"last_name" : "smith"}}
]
}
},
"aggs" : {
"location" : {
"nested" : {
"path" : "location"
},
"aggs" : {
"state" : {
"terms" : {"field" : "location.state", "size" : 10}
}
}
}
}
}'
响应:
{ "took" : 104,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1248513,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"location" : {
"doc_count" : 2107012,
"state" : {
"buckets" : [ {
"key" : 6,
"key_as_string" : "6",
"doc_count" : 214754
}, {
"key" : 12,
"key_as_string" : "12",
"doc_count" : 168887
}, {
"key" : 48,
"key_as_string" : "48",
"doc_count" : 101333
} ]
}
}
}
}
doc_count比命中总数大得多。因此,必须有重复项。
谢谢!
回答:
我认为您需要reverse_nested
聚合,因为您希望基于嵌套值进行聚合,但实际上是在计算ROOT文档,而不是嵌套文档
{ "query": {
"bool": {
"must": [
{
"term": {
"last_name": "smith"
}
}
]
}
},
"aggs": {
"location": {
"nested": {
"path": "location"
},
"aggs": {
"state": {
"terms": {
"field": "location.state",
"size": 10
},
"aggs": {
"top_reverse_nested": {
"reverse_nested": {}
}
}
}
}
}
}
}
结果,您将看到类似以下的内容:
"aggregations": { "location": {
"doc_count": 6,
"state": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "ny",
"doc_count": 4,
"top_reverse_nested": {
"doc_count": 2
}
},
{
"key": "ca",
"doc_count": 2,
"top_reverse_nested": {
"doc_count": 2
}
}
]
}
}
}
而您正在寻找的top_reverse_nested
部分内容。这里要指出的一点是:如果我没有记错的"doc_count":
6是NESTED文档计数,那么不要以为您正在计算根文档而对这些数字感到困惑,因为计数是嵌套的。因此,对于具有三个匹配的嵌套文档的文档,计数为3,而不是1。
以上是 如何通过使用Elasticsearch聚合返回唯一文档的数量 的全部内容, 来源链接: utcz.com/qa/409386.html