如何通过使用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

回到顶部