一种可能的方法是使用其他可用的脚本选项。mvel
除非启用动态脚本,否则似乎无法使用。并且,除非对脚本启用/禁用进行更细粒度的控制达到 1.6 版本,我认为不可能启用动态脚本mvel
而不是为了groovy
.
我们剩下native
and mustache
(用于模板)默认启用。我不认为可以使用自定义脚本来完成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>
{
"aggs": {
"max_score": {
"max": {
"script": "my_script",
"lang": "native"
}
}
}
}
我上面的示例仅返回_score
作为脚本,但当然,它可以用于更高级的场景。
编辑:如果不允许您触摸实例,那么我认为您没有任何选择。