术语聚合仅考虑要聚合的前缀

时间:2014-04-14 18:53:38

标签: elasticsearch

在我的弹性搜索文档中,我有用户和他在组织中的位置的某种表示,例如: 首席执行官是第一位 CEO直接领导的将是1 / 1,1 / 2,1 / 3等 1/1以下的那些将是1/1 / 1,1 / 1 / 2,1 / 3/3等

我有一个聚合,我希望通过VP聚合,所以我希望每个人都在1/1,1 / 2,1 / 3之间。

为此,我创建了一个像这样的查询:

"aggs": {
            "information": {
                "terms":{
                    "field": "position",
                    "script": "_value.replaceAll('(1/1/[0/]*[1-9]).+', '$1')"
                } 

这将得到前缀并由正则表达式中的组替换,因此每个人都有相同的位置,然后我可以进行聚合。这表现不佳。

我在考虑使用类似的东西

"aggs": {
            "information": {
                "terms":{
                    "field": "position",
                    "prefix": "1/1/.*'
                } 

所以我会以每个以1/1开头的人分组(1/1/1 / 1,1 / 1/1 / 2,1 / 1/1/3将是一组,1/1/2 / 1,1 / 1/2 / 2,1 / 1/2/3将是第二组,依此类推。)

有可能吗?

1 个答案:

答案 0 :(得分:0)

如果您事先知道要运行此聚合的级别有多深,则可以将这些级别存储在不同的字段中:

{
    "name": "Jack",
    "own_level": 4,
    "level_1": "1",
    "level_2": "3",
    "level_3": "2",
    "level_4": null
}

但这需要许多嵌套术语聚合来重现层次结构。这个版本可以使一个这样的聚合充分:

{
    "name": "Jack",
    "own_level": 4,
    "level_1": "1",
    "level_2": "1/3",
    "level_3": "1/3/2",
    "level_4": null
}

如果您希望通过在字段1/1上设置过滤器并在字段level_2上设置字词汇总来关注例如level_3下的人员,那么它还具有更简单的查询过滤器。

如果您不知道层次结构的最高级别,您可以使用这样的嵌套文档,但查询和聚合会变得更复杂:

{
    "name": "Jack",
    "own_level": 4,
    "bosses": [
        {
            "level": 1,
            "id": "1"
        },
        {
            "level": 2,
            "id": "1/3"
        },
        {
            "level": 3,
            "id": "1/3/2"
        }
    ]
}