我试图在一个字段的分析器中使用一个分析器,并得到它的聚合,如果这有意义的话。
如。
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代码操作吗?
非常感谢您的帮助。
谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!