嵌套(非数组)字段上的 Elasticsearch 聚合
Elasticsearch aggregation on nested (not array) field
我不太清楚嵌套字段不是数组而是简单对象的聚合。
让我们考虑一个简单的案例场景,我有一个带有语言的嵌套字段 + normalized_name(充当某种 ID)
# index/_mapping
"tags": {
"type": "nested",
"properties": {
"english": {
"type": "text",
"analyzer": "english"
},
"french": {
"type": "text",
"analyzer": "french_light"
},
"normalized": {
"type": "keyword"
}
}
},
给定一个搜索查询 Q,我想汇总其标签(英文或法文或规范化)与我的术语完全匹配的文档数量(如果文档匹配多个 fr/en/normalized 嵌套,则应只计算一次字段,但这并不重要,因为 english/french/normalized 都是区分大小写的(但可能不区分大小写)并使用它们的 tags.normalized
作为我聚合的关键。我相信我有过滤做对了,但我仍然没有得到任何桶...
以前,当我只有一个值时,我正在做
aggs: {tags: {terms: {field: "tag", size: 1000}}}}}
当我阅读文档时,我看到很多对嵌套聚合的引用,但它们似乎都是关于聚合中的嵌套聚合,但我只想根据嵌套字段聚合文档计数。我试过类似
aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}
...不过好像不行。我必须使用 nested
语法吗?我不想以嵌套聚合的结果结束,只是在嵌套字段上聚合...
啊,糟糕,经过几次尝试并更清楚地阅读文档后,我意识到 Elasticsearch 的 nested
类型只是 "nested array" 而不是 "nested object"。
对于嵌套对象,我只需要在我的映射中使用 type: :object
...在此之后使用 aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}
一切正常
我不太清楚嵌套字段不是数组而是简单对象的聚合。
让我们考虑一个简单的案例场景,我有一个带有语言的嵌套字段 + normalized_name(充当某种 ID)
# index/_mapping
"tags": {
"type": "nested",
"properties": {
"english": {
"type": "text",
"analyzer": "english"
},
"french": {
"type": "text",
"analyzer": "french_light"
},
"normalized": {
"type": "keyword"
}
}
},
给定一个搜索查询 Q,我想汇总其标签(英文或法文或规范化)与我的术语完全匹配的文档数量(如果文档匹配多个 fr/en/normalized 嵌套,则应只计算一次字段,但这并不重要,因为 english/french/normalized 都是区分大小写的(但可能不区分大小写)并使用它们的 tags.normalized
作为我聚合的关键。我相信我有过滤做对了,但我仍然没有得到任何桶...
以前,当我只有一个值时,我正在做
aggs: {tags: {terms: {field: "tag", size: 1000}}}}}
当我阅读文档时,我看到很多对嵌套聚合的引用,但它们似乎都是关于聚合中的嵌套聚合,但我只想根据嵌套字段聚合文档计数。我试过类似
aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}
...不过好像不行。我必须使用 nested
语法吗?我不想以嵌套聚合的结果结束,只是在嵌套字段上聚合...
啊,糟糕,经过几次尝试并更清楚地阅读文档后,我意识到 Elasticsearch 的 nested
类型只是 "nested array" 而不是 "nested object"。
对于嵌套对象,我只需要在我的映射中使用 type: :object
...在此之后使用 aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}