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

news2024/11/27 1:18:03

文本相似度插件开发,本文基于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");
    }


    @Override
    public List<NativeScriptFactory> getNativeScripts() {
        return Collections.singletonList(new MyNativeScriptFactory());
    }

    public static class MyNativeScriptFactory implements NativeScriptFactory {
        private final static Logger LOGGER = LogManager.getLogger(MyNativeScriptFactory.class);

        @Override
        public 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);
        }

        @Override
        public boolean needsScores() {
            return false;
        }

        @Override
        public 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;
        }

        @Override
        public 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.coloradmin.cn/o/336160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

koa ts kick off 搭建项目的基本架子

koa ts kick off 使用ts开发koa项目的基本架子&#xff0c;便于平时随手调研一些技术 项目结构 ├── src │ ├── controller //controller层 │ ├── service //service层 │ ├── routes.ts //路由 │ └── index.ts //项目入…

【图像配准】多图配准/不同特征提取算法/匹配器比较测试

前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务&#xff0c;其次对不同特征提取器/匹配器效率进行进一步实验探究。 各类算法原理简述 看到有博文[1]指出&#xff0c;在速度方面SIFT<SURF<BRISK<FREAK<ORB&#xff0c;在对有较大模糊的图像配准时&…

04 react css上下浮动动画效果

react css上下浮动动画效果html原生实现上下浮动react 实现上下浮动思路分析实现步骤1.引入useRef2.在所属组件内定义—个变量3.在按钮上添加事件4.定义点击事件对window.scrollTo()进行了解&#xff1a;在react中实现效果图&#xff1a;html原生实现上下浮动 我们有一个导向箭…

【分享】订阅金蝶KIS集简云连接器同步OA付款审批数据至金蝶KIS

方案简介 集简云基于钉钉连接平台完成与钉钉的深度融合&#xff0c;实现钉钉OA审批与数百款办公应用软件&#xff08;如金蝶KIS、用友等&#xff09;的数据互通&#xff0c;让钉钉的OA审批流程与企业内部应用软件的采购、付款、报销、收款、人事管理、售后工单、立项申请等环节…

【2023面试秘籍】 测试工程师的简历该怎么写?

作为软件测试的垂直领域深耕者&#xff0c;面试或者被面试都是常有的事&#xff0c;可是不管是啥&#xff0c;总和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等&#xff0c;面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;…

【Java 面试合集】重写以及重载有什么区别能简单说说嘛

重写以及重载有什么区别能简单说说嘛 前述 这是一道非常基础的面试题&#xff0c;我们在回答的过程中一定要逐一横向比较。 从方法的 修饰符&#xff0c;返回值&#xff0c;方法名&#xff0c;含义&#xff0c;参数等方面进行逐一分析来比较不同。 话不多话&#xff0c;看下…

什么样的台灯适合学生做作业的?开学季,适合孩子写作业的台灯

学生在做作业时&#xff0c;是离不开台灯的&#xff0c;在台灯下学习三四个小时&#xff0c;如果台灯质量不好&#xff0c;那对视力造成很大影响&#xff0c;研究表明&#xff0c;儿童在过亮或者过暗的环境中长时间学习&#xff0c;会导致视力下降等&#xff0c;那么什么样的台…

瀚博半导体载天VA1 加速卡安装过程

背景&#xff1a; 想用 瀚博半导体载天VA1 加速卡 代替 NVIDIA 显卡跑深度学习模型 感谢瀚博的周工帮助解答。 正文&#xff1a; 小心拔出 NVIDIA 显卡&#xff0c;在PCIe 接口插上瀚博半导体载天VA1加速卡&#xff0c;如图&#xff1a; 这时显示屏连接主板的集成显卡 卸载…

cookie和Session的作用和比较

目录 什么是cookie cookie的工作原理 什么是session Session的工作原理 为什么会有session和cookie cookie和session如何配合工作 cookie和Session作用 什么是会话 什么是cookie cookie是web服务器端向我们客户端发送的一块小文件&#xff0c;该文件是干嘛的呢&#xf…

Java基础知识疑难点

1. 基础 1.1. 正确使用 equals 方法1.2. 整型包装类值的比较1.3. BigDecimal 1.3.1. BigDecimal 的用处1.3.2. BigDecimal 的大小比较1.3.3. BigDecimal 保留几位小数1.3.4. BigDecimal 的使用注意事项1.3.5. 总结 1.4. 基本数据类型与包装数据类型的使用标准 2. 集合 2.1. Arr…

Docker-用Jenkins发版Java项目-(1)Docke安装Jenkins

文章目录前言环境背景操作流程docker安装及jenkins软件安装jenkins配置登录配置安装插件及创建账号前言 学海无涯&#xff0c;旅“途”漫漫&#xff0c;“途”中小记&#xff0c;如有错误&#xff0c;敬请指出&#xff0c;在此拜谢&#xff01; 最近新购得了M2的MAC&#xff0c…

LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)

文章目录一、编程题&#xff1a;430. 扁平化多级双向链表&#xff08;双指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;二、解题思路1. 题目分析2. 方法1&#xff08;哈希表&#xff09;思路&#xff1a;复杂度分析&…

备考 PMP 考试时需要着重注意什么?

PMP考试难度并不是很大。科学备考一定没有问题的&#xff5e;这里在和大家说说2023年PMP的考试时间&#xff1a;3月、5月、8月、11月&#xff08;其中3月不开启新报名&#xff09;需要注意的地方还是蛮多的。我就根据自己考试的经验和大家分享一下在考试整个过程中注意啥&#…

2023年广西最新建筑施工焊工(建筑特种作业)模拟试题及答案

百分百题库提供特种工&#xff08;焊工&#xff09;考试试题、特种工&#xff08;焊工&#xff09;考试预测题、特种工&#xff08;焊工&#xff09;考试真题、特种工&#xff08;焊工&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻…

【nodejs】nodejs入门核心知识(命令行使用、内置模块、node 模块化开发)

&#x1f4bb; nodejs入门核心知识(命令行使用、内置模块、node 模块化开发) &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享…

(1分钟突击面试) 高斯牛顿、LM、Dogleg后端优化算法

高斯牛顿法 LM法 DogLeg方法编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;知识点&#xff1a;高斯牛顿是线搜索方法 LM方法是信赖域方法。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;这个就是JTJ是…

React设计原理—1框架原理

阅读前须知 本文是笔者学习卡颂的《React设计原理》的读书笔记&#xff0c;对书中有价值内容以Q&A方式进行呈现&#xff0c;同时结合了自己的理解&#x1f914;阅读时推荐先看问题&#xff0c;想想自己的答案&#xff0c;再和答案比对一下本文属于前端框架科普&#xff0c;…

68. Python的相对路径

68. Python的相对路径 文章目录68. Python的相对路径1. 知识回顾2. 什么是相对路径3. 相对路径的语法4. 查看相对路径的方法5. 写出所有txt文件的相对路径5.1 同目录5.2 上级目录6. 用相对路径读取txt文件6.1 读取旅游.txt6.2 读取旅游经费.txt6.3 读取笔记.txt和new.txt6.4 读…

微服务调用组件Feign

目录 JAVA 项目中如何实现接口调用&#xff1f; Httpclient Okhttp HttpURLConnection RestTemplate WebClient 什么是Feign 优势 Spring Cloud Alibaba快速整合OpenFeign 引入依赖 编写调用接口FeignClient注解 调用端在启动类上添加EnableFeignClients注解 发起调…

【送书活动】学Vue核心技术和uni-app跨平台实战项目就来看看这本书

本节目录1、书籍介绍2、推荐理由2.1 有充足的配套资源图书页内展示。2.2 PPT示例代码讲解演示2.3 内容由浅入深&#xff0c;渐进式学习3、参与方式1、书籍介绍 本书共分为14个章节&#xff0c;包括Vue.js核心基础、Vue.js高级进阶、Axios发送HTTP请求&#xff0c;Vuex状态管理…