如何使ElasticSearch聚合计数父文档而不是嵌套文档?

3

我的ElasticSearch索引有嵌套文档,用于指示与文档相关的各种事件发生的地点。我正在使用聚合来获取这些地点的特征。返回的计数是该地点发生次数的计数。例如,如果一个文档有加利福尼亚州的出生和死亡地点,则加利福尼亚州的聚合计数为2。我希望聚合计数是包含特定地点的文档数,而不是包含该地点的子文档数。我的模式的相关部分如下:

"mappings": {
    "document": {
        "properties": {
            "docId" : { "type": "keyword" },
            "place": {
                "type": "nested",
                "properties": {
                    "id": { "type": "keyword" },
                    "type": { "type": "keyword" },
                    "loc": { "type" : "geo_point" },
                    "text": { 
                        "type": "text",
                        "analyzer": "english",
                        "copy_to" : "text"
                    }
                },
                "dynamic": false
            }
        }
    }
}

我可以使用简单的聚合来获取分面,例如检索类型为place.vital.*(例如place.vital.birth、place.vital.death等)的位置,但计算的是嵌套文档的数量,而不是父文档的数量。
"aggs": {
"place.vital": {
  "aggs": {
    "types": {
      "aggs": {
        "values": {
          "terms": {
            "field": "place.id"
          }
        }
      },
      "terms": {
        "field": "place.type",
        "include": "place\\.vital\\..*"
      }
    }
  },
  "nested": {
    "path": "place"
  }
}

有没有可能调整我的聚合,使其仅计算每个父文档一次?

2个回答

3

-1
我相信你可以用嵌套字段来实现,但不能用父子关系。如果你在寻找地点,为什么不在地点索引中搜索并按子项进行过滤呢? 有子查询

我最初的想法是反向嵌套聚合。嗯...那显然只适用于嵌套类型。我不认为父子类型有相应的等效方法。也许在索引这些文档的方式中甚至不可能实现。 - Tracy Moody
是的,在父子关系中不存在这种情况。另一种方法是对数据进行去规范化,并将所有事件数据序列化到位置索引上,但这可能会根据每个位置的事件数量而性能不佳。 - Carlos
伙计们,他正在使用嵌套字段...那你们为什么要谈论父子关系呢? - richardwhatever
你是对的。我犯了个错误。这可以通过反向嵌套聚合来实现。 - Carlos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接