目录

为什么要将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呢?路径要怎么写?

依赖的动态链接库一共有:libiomp5md,mkldnn,mklml,lacjni四个。都要加载进程序

生成插件

用gradle pz,将依赖的资源打在jar外。这样可以避免jar内程序访问jar内部资源的路径问题,尤其是访问文件夹!这种还不同于单个文件,可以复制到jar外指定路径再读。

把动态链接库打包到jar外后,资源路径resourcePath可以这样得到:

String curJarPath = java.net.URLDecoder.decode(url.gerPath(), "utf-8");
int index = curJarPath.lastIndexOf('/');
String resourcePath = curJarPath.substring(0, index+1);

安装、运行插件

本地调试的模式下,将生成插件解压到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分词插件相关推荐

  1. Elasticsearch学习笔记(三)安装hanlp中文分词插件及同义词配置

    目录 hanlp分词插件 插件安装 在线安装 离线安装 安装数据包 同义词配置 hanlp分词插件 HanLP是一款免费开源(Apache License 2.0协议)中文语义分词工具,它提供中文分词 ...

  2. [Elasticsearch](五)Docker环境下搭建Elasticsearch,Elasticsearch集群,Elasticsearch-Head以及IK分词插件和拼音分词插件

    目录: https://github.com/dolyw/ProjectStudy/tree/master/Elasticsearch DockerStudy dolyw:https://note.d ...

  3. elasticsearch之分词插件使用

    elasticsearch对英文会拆成单个单词,对中文会拆分成单个字.下面来看看是不是这样. 首先测试一下英文: GET /blog/_analyze {"text": " ...

  4. 基于 Ansj 的 elasticsearch 2.3.1 中文分词插件

    前言 这是一个elasticsearch的中文分词插件,基于Ansj中文分词.发起者Onni大神. 2.3.1插件安装 进入Elasticsearch目录运行如下命令 进入es目录执行如下命令 ./b ...

  5. Elasticsearch拼音分词插件安装和使用

    1.下载拼音分词插件,要和安装的es版本保持一致,我的版本是7.9.3 插件源码地址:https://github.com/medcl/elasticsearch-analysis-pinyin 但是 ...

  6. Elasticsearch拼音分词插件安装

    Elastic的Medcl提供了一种搜索Pinyin搜索的方法.拼音搜索在很多的应用场景中都有被用到.比如在百度搜索中,我们使用拼音就可以出现汉字: 对于我们中国人来说,拼音搜索也是非常直接的.那么在 ...

  7. Elasticsearch如何修改拼音分词插件支持音调搜索

    背景 es默认加载的拼音分词插件是不支持音调搜索的,如何修改插件使得它支持音调搜索?又或者多音字你想要默认的读音是另外一个,例如曾默认读音是ceng,我想修改其默认读音为zeng. 下载拼音分词插件代 ...

  8. elasticsearch分词器Jcseg安装手册

    Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...

  9. elasticsearch5安装和elasticsearch-analysis-ik中文分词插件安装

    ElasticSearch简介 Elastic有一条完整的产品线及解决方案:Elasticsearch.Kibana.Logstash等,前面说的三个就是大家常说的ELK技术栈. Elasticsea ...

最新文章

  1. 物联网时代 公共建筑应该改变些什么
  2. Anaconda tensorflow 安装笔记
  3. 2018双一流排名 计算机,2018年42所双一流大学本硕博录取人数排名,规模优势凸显!...
  4. JS DOM节点(当前标签和同级、父级、子级..之间的关系)
  5. 181031每日一句
  6. 约瑟夫问题MATLAB代码
  7. p20 021 函数:我的地盘听我的
  8. cpu,内存占用率过高解决方法
  9. 四种Linux硬盘分区方式,首次安装Linux之磁盘分区
  10. 如何阻止iCloud照片库使用手机数据
  11. 计算机一级插入页码,计算机一级WPS辅导:用WPSOffice2007插入特色页码
  12. JAVA毕业设计花卉网站计算机源码+lw文档+系统+调试部署+数据库
  13. 2022年圣诞节 | matlab实现炫酷的圣诞树
  14. 《吴恩达深度学习》学习笔记002_神经网络的编程基础(Basics of Neural Network programming)
  15. 毒液蛋白质相互作用分析
  16. 数模每日小练习——数据处理——插值
  17. 【综述】近年来NLP在法律领域的相关研究工作
  18. 欧拉函数+狄利克雷卷积+莫比乌斯函数+莫比乌斯反演+整除分块+杜教筛
  19. 概率论与数量统计(二)_第2章随机变量及其概率分布__贝努利试验
  20. 西瓜书第二章阅读笔记

热门文章

  1. 用html4绘制海豚,python+matplotlib绘制简单的海豚(顶点和节点的操作)
  2. java面试题大全必备神器
  3. 总结Java反射面试题(附答案)
  4. Star-CCM+询问帖
  5. Java基本数据类型和封装类
  6. mysql查看表结构三种方法
  7. AlarmManager(闹钟服务)
  8. windows系统内存结构概述(重要概念释疑)
  9. linux 运行ctl文件_Linux磁盘检测工具smartctl的使用和分析
  10. java做橡皮擦效果_基于canvas剪辑区域功能实现橡皮擦效果