弹性聚合:如何在已分析的聚合中分析聚合

g52tjvyc  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(0)|浏览(194)

我试图在一个字段的分析器中使用一个分析器,并得到它的聚合,如果这有意义的话。
如。

Field1.value: 'A01/00 | A02/01 | B01/00'
Field2.value: 'A01/01 | C02/01 | D01/00'

目前,我有一个定制的模式分析器,它通过|模式对术语进行索引,将field1.value和field2.value分为:

Field1.value terms: [A01/00, A02/01, B01/00]
Field2.value terms: [A01/01, C02/01, D01/00]

如果我现在加起来,每个项的值都是1。
我想要实现的是通过另一个模式分析器通过正斜杠(“/”)模式进一步分析这些结果,创建:

Field1.value final terms: [A01, A02, B01]
Field2.value final terms: [A01, C02, D01]

这将导致a01项聚合值返回2,这就是我想要的。
我尝试了一个无痛的脚本到我的弹性java api代码中:

new Script(ScriptType.INLINE, "painless",
    "def path = doc['field.analyzer'].value; " +
    "if (path != null) {" +
    "int index = path.lastIndexOf('/'); " +
    "if (index > 0) {" +
    "return path.substring(0, index);" +
    "}" +
    "}" +
    "return ''", Collections.emptyMap())

它给出了我想要的“final”项,但只返回第一个条“|”之前的第一个项,而我想要所有的final项。
工程安装。

Field1.value final terms: [A01]
Field2.value final terms: [A01]
= gives a value count of 2 for 'A01' but only returns 'A01'

我还尝试循环遍历这些值并将它们添加到数组中,但是聚合计数会变得混乱并且不准确,这就破坏了使用聚合的整个目的。

new Script(ScriptType.INLINE, "painless",
    "List returnList = new ArrayList(); " +
    "for (int i = 0; i < doc['field.analyzer'].length; i++) {" +
    "def path = doc['field.analyzer'][i]; " +
    "if (path != null) { " +
    "int index = path.lastIndexOf('/'); " +
    "if (index > 0) { " +
    "returnList.add(path.substring(0, index)); " +
    "} else { " +
    "returnList.add('');} " +
    "} else { " +
    "returnList.add('');}} " +
    "return returnList ", Collections.emptyMap()));

退货:

Field1.value final terms: [A01, A02, B01] value count of exactly one
Field2.value final terms: [A01, C02, D01] value count of exactly one

在不改变数据结构的情况下,是否有必要执行嵌套分析器索引或嵌套聚合?或者可以使用无痛的方式返回正确的聚合术语和值计数,而不必执行额外的java代码操作吗?
非常感谢您的帮助。
谢谢!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题