如何计算弹性搜索中嵌套字段中的对象数? 样本映射:
"base_keywords": {
"type": "nested",
"properties": {
"base_key": {
"type": "text"
},
"category": {
"type": "text"
},
"created_at": {
"type": "date"
},
"date": {
"type": "date"
},
"rank": {
"type": "integer"
}
}
}
我想计算嵌套字段'base_keywords'中的对象数。
答案 0 :(得分:0)
Aggs通常适用于计数和分组,对于嵌套文档,您可以使用嵌套的aggs:
"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对于分组和计数数据非常灵活。 “doc_count”和“key”的行为类似于+ count()
的sql组更新(假设您有一个.keyword字段创建“keys”值,因为“text”类型的属性无法聚合或计算:
{
"aggs": {
"MyKeywords1Agg": {
"nested": { "path": "keywords1" },
"aggs": {
"NestedKeywords": {
"terms": {
"field": "keywords1.keys.keyword",
"size": 0
}
}
}
}
}
}
只需计算嵌套键的数量,您就可以这样做:
{
"aggs": {
"MyKeywords1Agg": {
"nested": { "path": "keywords1" }
}
}
}
如果要对“主”文档或嵌套文档上的字段值进行一些分组,则必须扩展映射/数据模型以包含可聚合的术语,其中包括elasticsearch中的大多数数据类型,但“text”,例如:日期,数字,地理位置,关键字。
编辑: 聚合每个顶级文档的唯一标识符的示例,假设您有一个名为“WordMappingId”的属性为整数
{
"aggs": {
"word_maping_agg": {
"terms": {
"field": "WordMappingId",
"size": 0,
"missing": -1
},
"aggs": {
"Keywords1Agg": null,
"nested": { "path": "keywords1" }
}
}
}
}
如果您没有在顶层的“word_maping”文档中添加任何属性,则无法对每个唯一文档进行聚合。内置_id字段默认情况下不可聚合,我建议您在顶层的源数据中包含一个唯一标识符以进行聚合。
注意:“missing”参数会将所有没有设置WordMappingId属性的文档放在一个带有提供值的文本中,这样可以确保您没有遗漏搜索结果中的任何文档。
Aggs可以在SQL中支持类似于组的行为,但是您需要实际对其进行分组,并且根据您提供的映射,索引中当前没有此类字段。
答案 1 :(得分:0)
您需要使用内联脚本来执行此操作。这对我有用:(使用ES 6.x):
GET your-indices/_search
{
"aggs": {
"whatever": {
"sum": {
"script": {
"inline": "params._source.base_keywords.size()"
}
}
}
}
}