嵌套(非数组)字段上的弹性搜索聚合

时间:2018-04-25 09:08:50

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation

对于不是数组而是简单对象的嵌套字段的聚合,我不太清楚。

让我们考虑一个简单的案例场景,其中我有一个带有语言的嵌套字段+ 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 /规范化嵌套字段匹配,则应仅计算一次但是这并不重要,因为英语/法语/规范化都是区别敏感的(不过可能不区分大小写)并使用他们的tags.normalized作为我聚合的关键。我相信我已经正确地进行了过滤,但我还没有得到任何桶......

以前,当我有一个值时,我正在做

aggs: {tags: {terms: {field: "tag", size: 1000}}}}} 

当我阅读文档时,我看到许多对嵌套聚合的引用,但它们似乎都是关于聚合内的嵌套聚合,但我只想基于嵌套字段聚合文档计数。我尝试过像

这样的东西
aggs: {tag_names: {terms: {field: "tags.normalized", size: 100}}

......但它似乎不起作用。我必须使用nested语法吗?我不希望最终得到嵌套聚合的结果,只是为了在嵌套字段上聚合...

1 个答案:

答案 0 :(得分:0)

啊,我的不好,经过几次尝试并更清楚地阅读文档后,我意识到Elasticsearch的{​​{1}}类型只是一个"嵌套数组"而不是"嵌套对象"。

对于嵌套对象,我只需要在我的映射中使用stringBuilder.append("\n"); ...之后使用nested

可以很好地运行