【java】将LAC改造成Elasticsearch分词插件
目录
为什么要将LAC改造成ES插件?
怎么将LAC改造成ES插件?
确认LAC java接口能work
搭建ES插件开发调试环境
编写插件
生成插件
安装、运行插件
linux版本的动态链接库生成
总结
参考文档
为什么要将LAC改造成ES插件?
ES是著名的非关系型文档数据库,开源、近实时、分布式,很多搜索引擎比如github、维基百科等都是以ES为骨架搭建的。我们也想基于ES搭建一套自己的搜索引擎。搜索引擎涉及到大量的自然语言处理(nlp),当前nlp的大量库类,尤其神经网络,基本都是基于python开发的,很少基于其他语言的。然而ES是用java语言开发的,这导致它没能很好的和当前nlp技术融合。但是ES有一个优点:预留了插件接口,这使它保留了扩展能力。一个很自然的想法就是,把python的nlp类库包装成ES插件。
我们调研后发现,常见的ES分词插件比如IK,效果其实一般。LAC是百度研发的一款词法分析工具,分词准确度、运行速度都不错。我们希望把它改造成ES插件。LAC本身python第三方库,官方也提供了c++、java、android语言的调用接口。具体见GitHub - baidu/lac。
根据github上公开的源码,我们发现,LAC的java接口其实是用JNI调c++的动态链接库。它还提供了window环境下编译好的LAC动态链接库以及java调用的demo (https://github.com/baidu/lac/releases/tag/v2.0.0)。这太好了,我们就以windows环境下的ES-LAC插件开发作为切入点。
开发环境说明:
windows 10
intellij IDEA 2020.1.2社区版
gradle是intellij IDEA自带的,6.6.1
java 14
elasticsearch 7.10.2版github源码
lac4javawin
(java和IDEA版本是经过千辛万苦试探出来的,建议别瞎改)
怎么将LAC改造成ES插件?
确认LAC java接口能work
解压lac4javawin,同地址下载models_general。把LacMulti.java部分的argv拼写错误修正(或者把这个LacMulti.java删掉)。修改model_path为models_general下的lac路径,必要时将system.loadlibrary修改成system.load(lacjni.dll的绝对路径,不省略后缀),
运行lacDemo.java。能对输入的句子进行分词即为成功。
搭建ES插件开发调试环境
es调试有两种方式:远程调试,本地调试。
远程调试是指:远方服务器上运行es,本地也启动同版本的es,远方和本地建立联系,那么在本地打上的断点,远方可以传回对应的断点内部值,实现了调试。相当于本地负责打断点,远方负责执行。这样做的好处是:本地不需要真的运行程序,对资源要求很低,而远方的程序保持在远方的环境下,是真正生产中的运行状态,不存在迁移环境带来的问题。唯一的要求,需要调试的部分,远程和本地得是一致的,其他地方,比如本地多加载了一个插件,不会影响调试
本地调试是指:直接在本地编译es,运行起来,在localhost:9200可以访问到es,这个编译好的es在本地真的搭起了一个文档数据库。
回到我们开发调试ES的场景:有一个半成品es插件,es可能因为插件的bug而报错终止。那么远程程序运行不起来,本地也不用想着调试了。所以,ES插件的开发调试环境,只能是本地调试。本地调试的步骤如下:
到github上release链接里下载7.10.2版本的ES源码。然后按照Elasticsearch idea本地启动/调试教程-适用不同操作系统_热心小伙chj的博客-CSDN博客里的步骤启动本地调试。注意:run configurations里,VM option里的路径,保持windows下的反斜杠,不用修改。同时,一定要勾选上“include independencies with provided scope”。
编写插件
仿plugins下的analysis-smartcn写。大坑:插件最终是要打成jar包的。jar里的程序如何访问包内的dll呢?路径要怎么写?
生成插件
用gradle pz,将依赖的资源打在jar外。这样可以避免jar内程序访问jar内部资源的路径问题,尤其是访问文件夹!这种还不同于单个文件,可以复制到jar外指定路径再读。
安装、运行插件
本地调试的模式下,将生成插件解压到Elasticsearch idea本地启动/调试教程-适用不同操作系统_热心小伙chj的博客-CSDN博客新建的myhome路径下的plugins文件夹下。
linux版本的动态链接库生成
这是一个大坑!百度的文档(lac/java at master · baidu/lac · GitHub)真是......,编译命令部分可以参考,资源链接部分就别管了。
1,下载paddle inference的库,版本是cpu_avx_mkl,链接是https://paddle-inference-lib.bj.bcebos.com/1.8.4-cpu-avx-mkl/fluid_inference.tgz
2,下载lac 2.1.0版源码(lac/java at v2.1.0 · baidu/lac · GitHub)
3,环境:redhat 7.4 + java 1.8 + gcc 5.5.0 + cmake 3.24.3 + binutils 2.26.2
4,把下载好的models_general,编译出来的代码和lib通通拷贝到windows下,用gradle打成jar包,然后把jar包拷贝到linux下运行。
总结
要本地调试,不要远程调试;
要模仿es源码编译中gradle引入的analysis插件,不要模仿在github上找的ik插件(这可是maven格式的,和es 7.10.2不兼容);
要把资源打在jar外,不要打在jar内;
参考文档
Linux下源码编译安装cmake、升级安装gcc-CSDN博客
相关文章:
【java】将LAC改造成Elasticsearch分词插件
目录 为什么要将LAC改造成ES插件? 怎么将LAC改造成ES插件? 确认LAC java接口能work 搭建ES插件开发调试环境 编写插件 生成插件 安装、运行插件 linux版本的动态链接库生成 总结 参考文档 为什么要将LAC改造成ES插件? ES是著名的非…...
TPM 2.0实例探索3 —— LUKS磁盘加密(5)
接前文:TPM 2.0实例探索3 —— LUKS磁盘加密(4) 本文大部分内容参考: Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 4. 将密码存储于TPM的PCR 现在将TPM非易失性存储器中保护…...
mybatisplus复习(黑马)
学习目标能够基于MyBatisPlus完成标准Dao开发能够掌握MyBatisPlus的条件查询能够掌握MyBatisPlus的字段映射与表名映射能够掌握id生成策略控制能够理解代码生成器的相关配置一、MyBatisPlus简介MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工…...
【数据聚类|深度聚类】Deep Comprehensive Correlation Mining for Image Clustering(DCCM)论文研读
Abstract 翻译 最近出现的深度无监督方法使我们能够联合学习表示和对未标记数据进行聚类。这些深度聚类方法主要关注样本之间的相关性,例如选择高精度对来逐步调整特征表示,而忽略了其他有用的相关性。本文提出了一种新的聚类框架,称为深度全面相关挖掘(DCCM),从三个方面…...
CE认证机构有哪些机构?
CE认证机构有哪些机构? 所有出口欧盟的产品都需要办理CE证明,而电子电器以及玩具是强制性要做CE认证。很多人以为只有办理欧盟NB公告机构的CE认证才可以被承认,实际上并不是。那么,除了NB公告上的机构,还有哪些认证机…...
MYSQL5.7:Access denied for user ‘root‘@‘localhost‘ (using password:YES)解决方法
一、打开MySQL目录下的my.ini文件,在文件的[mysqld]下面添加一行 skip-grant-tables,保存并关闭文件;skip-grant-tables :跳过密码登录,登录时无需密码。my.ini :一般在和bin同目录下,如果没有的话可自己创…...
单目运算符、双目运算符、三目运算符
单目运算符是什么 单目运算符是指运算所需变量为一个的运算符 又叫一元运算符,其中有逻辑非运算符:!、按位取 反运算符:~、自增自减运算符:,-等。 逻辑非运算符【!】、按位取反运算符【~】、 自…...
离线数据仓库项目搭建——准备篇
文章目录(一)什么是数据仓库(二)数据仓库基础知识(三)数据仓库建模方式(1)星行模型(2)雪花模型(3)星型模型 VS 雪花模型(四…...
十七、本地方法接口的理解
什么是本地方法? 1.简单来讲,一个Ntive method 就是一个Java调用非Java代码的接口.一个Native Method 是这样一个Java方法:该方法的实现由非Java语言实现,比如C,这个特征并非Java所特有,很多其他的编程语言都由这一机制,比如在C中…...
【halcon】模板匹配参数之金字塔级数
背景 今天,在使用模板匹配的时候,突然程序卡死,CPU直接飙到100%。最后排查发现是模板匹配其中一个参数 NumLevels 导致的: NumLevels: The number of pyramid levels used during the search is determined with numLevels. If n…...
jupyter lab安装和配置
jupyter lab 安装和配置 一、jupyter lab安装并配置 安装jupyterlab pip install jupyterlab启动 Jupyter lab默认会打开实验环境的,也可以自己在浏览器地址栏输入127.0.0.1:8888/lab 汉化 pip install jupyterlab-language-pack-zh-CN刷新一下网页࿰…...
用Docker搭建yolov5开发环境
拉取镜像 sudo docker pull pytorch/pytorch:latest 创建容器 sudo docker run -it -d --gpus "device0" pytorch/pytorch bash 查看所有容器 sudo docker ps -a 查看运行中的容器 sudo docker ps 进入容器 docker start -i 容器ID 将依赖包全都导入到requiremen…...
Apache Pulsar 云原生消息中间件之王
一、简介 pulsar,消息中间件,是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。 pulsar采用发布-订阅的设计模式,producer发布消息到topic,consumer订阅这些topic处理流入的消息,并当处理完…...
精选博客系列|公用事业中的VMware:在边缘重新定义价值
VMware 已经成为公用事业行业的核心。您可以在那里找到例如 VMware vSphere(包括基础 Hypervisor ESXi 和 VMware vCenter 建立的整体控制平面)的核心产品。来自软件定义的基础架构带来的诸多好处使 IT 团队将其先前基于硬件的系统转变为 VMware Cloud F…...
数字档案室测评的些许感悟
我是甲方,明明我家是档案“室”,为什么申请的是数字档案“馆”? 笔者正对着手里的一份方案苦笑,甲方爸爸是某机关单位档案室,方案最后的附件赫然写着几个大字:“申请国家级数字档案馆……“。这样的事屡见…...
Java 函数式编程实例
一、函数式编程概念 函数式编程是一种编程的范式和编程的方法论(programming paradigm),它属于结构化编程的一种,主要的思想是把运算的过程尽量通过一组嵌套的函数来实现。 函数式编程的几个特点: 函数可以作为变量、参数、返回值和数据类…...
Ant design Chart onReady函数使用外部变量问题
一、问题描述封装了一个Chart组件,它接收一个boolean类型的props,根据这个boolean的true或false执行不同的操作。经过console.log验证,onReady函数只会在组件初次渲染时取到props值,不管后面的props变化成什么都无法重新取值。二、…...
Unity使用webSocket与服务器通信(一)搭建一个简单地服务器和客户端
你想在unity WebGL里面使用TCP通信吗,那么你可以用一用webSocket。当然,桌面端也可以使用webSocket,这样Unity多平台发布的时候,业务层的通信代码可以使用一套,而不是桌面用socket,网页用http… 一、什么是…...
SpringCloud微服务实战——搭建企业级开发框架(四十九):数据字典注解的设计与实现
数据字典是系统中基本的必不可少的功能,在多种多样的系统中,数据字典表的设计都大同小异。但是使用方式确是多种多样,设计好一套易用的数据字典功能模块,可以使开发事半功倍。 常用的数据字典使用方式: 直接在SQL语句…...
mysql下,实现保存指定用户、ip、命令的查询日志
环境:mysql 8.0.14 社区版 阅读文本需要的背景知识:对数据库的基本概念(触发器、存储过程、事件),mysql下general log的配置指令 背景:因审计需要,对于数据库操作需要留痕。实际访问数据库的有…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
