如何获取ElasticSearch聚合来计算父文档而不是嵌套文档

时间:2018-02-12 15:03:54

标签: elasticsearch elasticsearch-aggregation

我的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 个答案:

答案 0 :(得分:1)

使用反向嵌套聚合。然后,这将创建具有嵌套计数的聚合和具有父计数的子聚合。

有关详细信息,请参阅how to return the count of unique documents by using elasticsearch aggregation

答案 1 :(得分:-1)

我确定您可以使用嵌套字段,但不能使用父子关系。如果您正在寻找地方为什么不搜索地点索引并按孩子过滤?

Has child query