在我的弹性搜索文档中,我有用户和他在组织中的位置的某种表示,例如: 首席执行官是第一位 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将是第二组,依此类推。)
有可能吗?
答案 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"
}
]
}