需求:在开发中需要安装自己特殊的需求对数据进行匹配和计算, 如图片相似度计算等,这时需要用到es插件
开发版本:elasticsearch 6.x
java 8
5:本例的项目代码
开发步骤:
1: 新建maven项目和maven编译插件 , maven项目管理工具能让你轻松构建项目以及解决麻烦的jar包依赖问题
<dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.2.2</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>2: 继承核心类
初始化插件: 继承 Plugin类,elasticsearch解析和注册插件
public class DemoPlugin extends Plugin implements ScriptPlugin { private final static Logger logger = LogManager.getLogger(com.esplugin.demo.DemoPlugin.class); @Override public ScriptEngine getScriptEngine(Settings settings, Collection<ScriptContext<?>> contexts) { logger.info("contexts : {} ", Arrays.toString(contexts.toArray())); return new MyScriptEngine(); } }
3: 核心处理类 ScriptEngine 6.x之后替换native scripts 使用 ScriptEngine 来注册和解析插件
构建自己的业务实现 ,构建自己的业务逻辑并且返回数据类型 , 这里我只是实现一个简单的demo,
获取前端输入值和获取es的存储值,进行比较以及返回结果类型
public class MyScriptEngine implements ScriptEngine { private final static Logger logger = LogManager.getLogger(MyScriptEngine.class); @Override public String getType() { return "expert_scripts"; //for lang } @Override public <T> T compile(String scriptName, String scriptSource, ScriptContext<T> context, Map<String, String> params) { logger.info("use params the scriptName {} ,scriptSource {}, context {},params {}", scriptName, scriptSource, context.name, params.entrySet()); // use type search if (!context.equals(SearchScript.CONTEXT)) { throw new IllegalArgumentException(getType() + " scripts cannot be used for context [" + context.name + "]"); } final String first = XContentMapValues.nodeStringValue(params.get("first"), null); final String second = XContentMapValues.nodeStringValue(params.get("second"), null); logger.info("first : {} , second : {} ", first, second); // query script use "source" value with identifier if ("demoPlugin".equals(scriptSource)) { SearchScript.Factory factory = (p, lookup) -> new SearchScript.LeafFactory() { @Override public SearchScript newInstance(LeafReaderContext context) throws IOException { return new SearchScript(p, lookup, context) { @Override public double runAsDouble() { // get es data final String test = (String) lookup.source().get("test"); logger.info("get source test data : {} ", test); if (first != null && first.equals(test)) { return 1.0D; } return Double.MAX_VALUE; } }; } @Override public boolean needs_score() { return false; } }; return context.factoryClazz.cast(factory); } throw new IllegalArgumentException("Unknown script name " + scriptSource); } @Override public void close() { // optionally close resources } }
这里只是一个测试用例,使用
4:示例代码:
https://github.com/ailice001/es-plugin-6x