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

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...