elasticsearch 在Elasticsearch中,每个文档中的嵌套对象计数不超过一次,elasticsearch,elasticsearch" /> elasticsearch 在Elasticsearch中,每个文档中的嵌套对象计数不超过一次,elasticsearch,elasticsearch" />

elasticsearch 在Elasticsearch中,每个文档中的嵌套对象计数不超过一次

elasticsearch 在Elasticsearch中,每个文档中的嵌套对象计数不超过一次,elasticsearch,elasticsearch,我有一个索引,其中包含以下结构的文档: { "_id" : "1234567890abcdef", ... "entities" : [ { "name" : "beer", "evidence_start" : 12, "evidence_end" : 16 }, { "name" : "water", "evidence_start" : 55, "evidence_end"

我有一个索引,其中包含以下结构的文档:

{
  "_id" : "1234567890abcdef",
  ...
  "entities" : [
    {  
      "name" : "beer",
      "evidence_start" : 12,
      "evidence_end" : 16
    },
    {  
      "name" : "water",
      "evidence_start" : 55,
      "evidence_end" : 60
    },
    {  
      "name" : "beer",
      "evidence_start" : 123,
      "evidence_end" : 127
    },
    ...
  ]
}
实体
是此处嵌套的
类型的对象。我需要数一数有多少文件提到了啤酒。
问题在于,一个明显的bucket聚合返回的是提及的数量,而不是文档,因此,如果在同一文档中两次提及
beer
,那么它也会将总结果加起来2。 我使用的查询是:

{
  ...
  "aggs": {
      "entities": {
        "nested": {
          "path": "entities"
        },
        "aggs": {
          "entity_count": {
            "terms": {
              "field": "entities.name",
              "size" : 20
            }
          }
        }
      }
    },
  ...
}
有没有一种方法可以只计算不同的提及而不编写脚本

非常感谢。

您只需将a作为子聚合,即可计算“主文档”的数量,而不是嵌套文档的数量

你应该试试

{
  ...
  "aggs": {
      "entities": {
        "nested": {
          "path": "entities"
        },
        "aggs": {
          "entity_count": {
            "terms": {
              "field": "entities.name",
              "size" : 20
            },
            "aggs": {
                "main_document_count": {
                    "reverse_nested": {}
                }
            }
          }
        }
      }
    },
  ...
}