如何在ElasticSearch中统计嵌套字段中的对象数?

dsf9zpds  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(3)|浏览(294)

如何在ElasticSearch中计算嵌套字段中的对象数?示例Map:

"base_keywords": {
  "type": "nested",
  "properties": {
    "base_key": {
      "type": "text"
    },
    "category": {
      "type": "text"
    },
    "created_at": {
      "type": "date"
    },
    "date": {
      "type": "date"
    },
    "rank": {
      "type": "integer"
    }
  }
}

我想计算嵌套字段“base_keywords”中的对象数。

lrpiutwd

lrpiutwd1#

您需要使用内联脚本来执行此操作。以下是对我有效的方法:(使用ES 6.x):

GET your-indices/_search
{

  "aggs": {
    "whatever": {
      "sum": {
        "script": {
          "inline": "params._source.base_keywords.size()"
        }
      }
    }
  }
}
r8xiu3jd

r8xiu3jd2#

Agg通常适用于计数和分组,对于嵌套文档,可以使用嵌套Agg:

"aggs": {
    "MyAggregation1": {
      "terms": {
        "field": "FieldA",
        "size": 0
      },
      "aggs": {
        "BaseKeyWords": {
          "nested": { "path": "base_keywords" },
          "aggs": {
            "BaseKeys": {
              "terms": {
                "field": "base_keywords.base_key.keyword",
                "size": 0
              }
            }
          }
        }
      }
    }
  }

您不需要指定要计数的内容,但是aggs在对数据进行分组和计数方面非常灵活。
已更新(这假定您有一个.keyword字段创建“keys”值,因为类型为“text”的属性不能被聚合或计数:

{
  "aggs": {
    "MyKeywords1Agg": {
      "nested": { "path": "keywords1" },
      "aggs": {
        "NestedKeywords": {
          "terms": {
            "field": "keywords1.keys.keyword",
            "size": 0
          }
        }
      }
    }
  }
}

为了简单地计算嵌套键的数量,您可以简单地执行以下操作:

{
  "aggs": {
    "MyKeywords1Agg": {
      "nested": { "path": "keywords1" }
    }
  }
}

如果您想对“主”文档或嵌套文档上的字段值进行分组,则必须扩展Map/数据模型,以包含可聚合的术语,这包括ElasticSearch中除“文本”之外的大多数数据类型,例如:日期数字地理位置关键字。
编辑:每个顶层文档的唯一标识符上的聚合示例,假设您在该文档上有一个名为“WordMappingId”的整型属性

{
  "aggs": {
    "word_maping_agg": {
      "terms": {
        "field": "WordMappingId",
        "size": 0,
        "missing": -1
      },
      "aggs": {
        "Keywords1Agg": null,
        "nested": { "path": "keywords1" }
      }
    }
  }
}

如果不向顶层的“word_mapping”文档添加任何属性,则无法对每个唯一文档进行聚合。builtin _id字段默认情况下是不可聚合的,我建议您在顶层的源数据中包含一个唯一标识符以进行聚合。
注意:“missing”参数会将所有没有设置WordMappingId属性的文档放入一个与所提供的值相对应的库中,这样可以确保搜索结果中没有丢失任何文档。
Aggs可以支持类似于SQL中group by的行为,但是您需要一些东西来实际分组,并且根据您提供的Map,您的索引中当前没有这样的字段。

ojsjcaue

ojsjcaue3#

我尝试执行类似的操作以了解生产数据分布。以下查询帮助我找到了前5个

{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "n_base_keywords": {
            "nested": { "path": "base_keywords" },
            "aggs": {
                "top_count": { "terms": { "field": "_id", "size" : 5 } }
            }
        }
    }
}

相关问题