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

【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刷新一下网页&#xff0…...

用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的配置指令 背景:因审计需要,对于数据库操作需要留痕。实际访问数据库的有…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...