一种可能的方法是使用其他可用的脚本选项。 mvel 似乎无法使用,除非启用动态脚本。而且,除非a more fine-grained control of scripting enable/disable 达到1.6 版本,否则我认为不可能为mvel 而不是groovy 启用动态脚本。
我们留下了默认启用的native 和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 作为脚本返回,但当然,它可以用于更高级的场景。
编辑:如果您不允许触摸实例,那么我认为您没有任何选择。