gpt4 book ai didi

groovy - ElasticSearch:在禁用 Groovy 的 _score 字段上进行聚合

转载 作者:行者123 更新时间:2023-11-29 02:47:46 24 4
gpt4 key购买 nike

我见过的每个在 _score 字段上进行聚合或与之相关的示例(例如 ElasticSearch: aggregation on _score field?)似乎都需要使用脚本。出于安全原因,ElasticSearch 默认禁用动态脚本,是否有任何方法可以在不诉诸于将脚本文件加载到每个 ES 节点或重新启用动态脚本的情况下实现这一目标?

我的原始聚合如下所示:

"aggs": {
"terms_agg": {
"terms": {
"field": "field1",
"order": {"max_score": "desc"}
},
"aggs": {
"max_score": {
"max": {"script": "_score"}
},
"top_terms": {
"top_hits": {"size": 1}
}
}
}

尝试指定表达式作为 lang 似乎不起作用,因为 ES 抛出一个错误,指出分数只能在用于排序时访问。我想不出任何其他方法来按分数字段排序我的桶。有人有什么想法吗?

编辑:澄清一下,我的限制是无法修改服务器端。即,作为 ES 安装或配置的一部分,我无法添加或编辑任何内容。

最佳答案

一种可能的方法是使用其他可用的脚本选项。 mvel 似乎无法使用,除非启用动态脚本。而且,除非 a more fine-grained control of scripting enable/disable达到 1.6 版本,我认为不可能为 mvel 而不是 groovy 启用动态脚本。

我们只剩下默认启用的 nativemustache(用于模板)。我不认为自定义脚本可以用 mustache 完成,如果可能的话我没有找到方法,我们只剩下 native (Java) 脚本。

这是我的看法:

  • 创建 NativeScriptFactory 的实现:
package com.foo.script;

import java.util.Map;

import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;

public class MyScriptNativeScriptFactory implements NativeScriptFactory {

@Override
public ExecutableScript newScript(Map<String, Object> arg0) {
return new MyScript();
}

}
  • AbstractFloatSearchScript 的实现,例如:
package com.foo.script;

import java.io.IOException;

import org.elasticsearch.script.AbstractFloatSearchScript;

public class MyScript extends AbstractFloatSearchScript {

@Override
public float runAsFloat() {
try {
return score();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}

}
  • 或者,构建一个简单的 Maven 项目以将所有内容联系在一起。 pom.xml:
<properties>
<elasticsearch.version>1.5.2</elasticsearch.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
  • 构建它并获得生成的 jar 文件。
  • 将 jar 放在 [ES_folder]/lib 中
  • 编辑 elasticsearch.yml 并添加
    script.native.my_script.type: com.foo.script.MyScriptNativeScriptFactory

  • 重启 ES 节点。

  • 在聚合中使用它:
{
"aggs": {
"max_score": {
"max": {
"script": "my_script",
"lang": "native"
}
}
}
}

我上面的示例只是将 _score 作为脚本返回,当然,它可以用于更高级的场景。

编辑:如果不允许您触摸实例,那么我认为您没有任何选择。

关于groovy - ElasticSearch:在禁用 Groovy 的 _score 字段上进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30086403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com