当前位置: 首页 > news >正文

Elasticsearch5.5.1 自定义评分插件开发

文本相似度插件开发,本文基于Elasticsearch5.5.1,Kibana5.5.1

下载地址为:

Past Releases of Elastic Stack Software | Elastic

本地启动两个服务后,localhost:5601打开Kibana界面,点击devTools,效果图

创建索引 PUT index

添加数据 GET index/doc_1,json

{

"title":"11111",

"feature":"搭建好ES之后,想用命令行简单测试一下,涉及到了下面几个命令,也遇到了一些问题,记录一下"

}

查询语句 GET index/doc_1/_search 必须有_search,不然就变插入或更新了


 

{"from": 0,"size": 15,"min_score": 0.3,"query": {"function_score": {"functions": [{"script_score": {"script": {"inline": "icon_hash","lang": "native","params": {"feature": "想"}}}}]}}
}

记录一下插件的写法:

1.相似度比较算法,pom

<dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version>
</dependency>

算法代码:

import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
public class TextComparator {public static double YUZHI = 0.1;public TextComparator() {}public static double getSimilarity(Vector<String> T1, Vector<String> T2) throws Exception {if (T1 != null &&T1.size() > 0 && T2 != null && T2.size() > 0) {Map<String, double[]> T = new HashMap();String index = null;int i;double[] c;for(i = 0; i < T1.size(); ++i) {index = (String)T1.get(i);if (index != null) {c = (double[])T.get(index);c = new double[]{1.0, YUZHI};T.put(index, c);}}for(i = 0; i < T2.size(); ++i) {index = (String)T2.get(i);if (index != null) {c = (double[])T.get(index);if (c != null && c.length == 2) {c[1] = 1.0;} else {c = new double[]{YUZHI, 1.0};T.put(index, c);}}}Iterator<String> it = T.keySet().iterator();double s1 = 0.0;double s2 = 0.0;double Ssum;for(Ssum = 0.0; it.hasNext(); s2 += c[1] * c[1]) {c = (double[])T.get(it.next());Ssum += c[0] * c[1];s1 += c[0] * c[0];}return Ssum / Math.sqrt(s1 * s2);} else {throw new Exception("传入参数有问题!");}}public static Vector<String> participle(String str) {Vector<String> str1 = new Vector();try {StringReader reader = new StringReader(str);IKSegmenter ik = new IKSegmenter(reader, true);Lexeme lexeme = null;while((lexeme = ik.next()) != null) {str1.add(lexeme.getLexemeText());}if (str1.size() == 0) {return null;}System.out.println("str分词后:" + str1);} catch (IOException var5) {System.out.println();}return str1;}public static void main(String[] args) {String s1 = "想";String s2 = "搭建好ES之后,想用命令行简单测试一下,涉及到了下面几个命令,也遇到了一些问题,记录一下";Double score;try {score = getSimilarity(participle(s1), participle(s2));} catch (Exception var5) {throw new RuntimeException(var5);}System.out.println(score);}public static Double getScore(String s1, String s2) {try {return getSimilarity(participle(s1), participle(s2));} catch (Exception var3) {throw new RuntimeException(var3);}}
}

Elasticsearch插件代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.plugins.ActionPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.ScriptPlugin;
import org.elasticsearch.script.AbstractDoubleSearchScript;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;import java.util.Collections;
import java.util.List;
import java.util.Map;public class IconHashPlugin extends Plugin implements ActionPlugin, ScriptPlugin {private final static Logger LOGGER = LogManager.getLogger(IconHashPlugin.class);public IconHashPlugin() {super();LOGGER.warn("Create the Basic Plugin and installed it into elasticsearch");}@Overridepublic List<NativeScriptFactory> getNativeScripts() {return Collections.singletonList(new MyNativeScriptFactory());}public static class MyNativeScriptFactory implements NativeScriptFactory {private final static Logger LOGGER = LogManager.getLogger(MyNativeScriptFactory.class);@Overridepublic ExecutableScript newScript(@Nullable Map<String, Object> params) {LOGGER.info("MyNativeScriptFactory  run new Script ");String featureStr = params == null ? null : XContentMapValues.nodeStringValue(params.get("feature"), null);if (featureStr == null) {LOGGER.error("Missing the field parameter ");}return new MyScript(featureStr);}@Overridepublic boolean needsScores() {return false;}@Overridepublic String getName() {return "icon_hash";}}public static class MyScript extends AbstractDoubleSearchScript {private final static Logger LOGGER = LogManager.getLogger(MyScript.class);private final String featureStr;public MyScript(String featureStr) {this.featureStr = featureStr;}@Overridepublic double runAsDouble() {LOGGER.info("my run As begining ");String strSrcFeature = (String) source().get("feature");String f1 = featureStr;String f2 = strSrcFeature;LOGGER.info("featureStr------> "+featureStr);LOGGER.info("strSrcFeature------> "+strSrcFeature);Double score = MyTextComparator.getScore(featureStr,strSrcFeature);LOGGER.info("score------> "+score);return score;}}
}

2.部署插件

打包啥的见我的另一个代码源码:

https://download.csdn.net/download/airyearth/87435594

本次主要就是替换了算法

3.部署插件,非常重要的一点就是把一些冲突的jar包删掉,copy进Elasticsearch的\elasticsearch-5.5.1\plugins后,手动删掉lucene所有的包,不然会和es冲突

重启es就可以了

http://www.lryc.cn/news/2138.html

相关文章:

  • 4.4 序列化与反序列化
  • 647. 回文子串 516. 最长回文子序列
  • 实用小妙招
  • 别让猴子跳回背上
  • 数据结构 | 线性表
  • Deepwalk深度游走算法
  • 微服务项目【服务调用分布式session共享】
  • 神经网络的万能逼近定理
  • 【信息系统项目管理师】项目管理过程的三万字大论文
  • 【C++】C++11 ~ 包装器解析
  • SpringBoot整合(三)SpringBoot发送邮件
  • 【docker知识】联合文件系统(unionFS)原理
  • 使用Lame库实现wav、pcm转mp3
  • c++11 标准模板(STL)(std::multimap)(三)
  • 【报复性赚钱】2023年5大风口行业
  • 单目相机、双目相机和RGB-D相机学习笔记(一些视频和博文网址)
  • word和wps添加mathtype选项卡
  • 获取成员userID
  • DOM编程-显示网页时钟
  • 浅谈保护数据的加密策略
  • Java中String,StringBuffer和StringBuilder
  • 华为认证常见技术问答整理:什么是Datacom认证?
  • Read book Netty in action (Chapter II) (Netty Introduction)
  • python--route
  • java面试中被问到项目中的难点,怎么回答
  • 【速通版】吴恩达机器学习笔记Part1
  • 面试(九)小米C++开发一面 21.11.02
  • 儿童书写台灯哪个牌子比较好?2023儿童护眼台灯分享
  • 市场调研计划书如何写?
  • python网络爬虫—快速入门(理论+实战)(七)