ES全文检索支持拼音和繁简检索
ES全文检索支持拼音和繁简检索
- 1. 实现目标
- 2. 引入pinyin插件
- 2.1 编译 elasticsearch-analysis-pinyin 插件
- 2.2 安装拼音插件
- 3. 引入ik分词器插件
- 3.1 已有作者编译后的包文件
- 3.2 只有源代码的版本
- 3.3 安装ik分词插件
- 4. 建立es索引
- 5.测试检索
- 6. 繁简转换
1. 实现目标
ES检索时无论输入简体还是繁体都要能够被检索到,例如检索时输入“語法”或者“语法”,检索结果中无论是简体繁体都务必要被命中。
并且也要正确的高亮返回

2. 引入pinyin插件
拼音分词器(pinyin analyzer)通常需要自行引入,因为它不是 Elasticsearch 的默认分词器。可以使用 Elasticsearch 的插件来引入 pinyin 分词器,以便在索引中使用它。
2.1 编译 elasticsearch-analysis-pinyin 插件
选择与自己版本一致的版本,插件地址:
https://github.com/medcl/elasticsearch-analysis-pinyin/releases

elasticsearch-analysis-pinyin分词器目前没有下载即可使用的安装包,需要自己下载源码进行编译。可以在项目目录elasticsearch-analysis-pinyin\target\releases看到编译后的结果elasticsearch-analysis-pinyin-7.17.11.zip

2.2 安装拼音插件
然后在es的安装目录下plugins目录下新建pinyin目录,并将解压后的文件复制到该目录下

重启es,启动日志中已经加载了拼音插件

3. 引入ik分词器插件
GitHub下载地址:Releases · infinilabs/analysis-ik · GitHub
3.1 已有作者编译后的包文件
选择与所需es版本相同的ik分词器,下载已经打包后的.zip文件

3.2 只有源代码的版本
首先下载源码解压后使用idea打开,修改es版本与分词器版本相同

使用 mvn clean install 打包时报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project elasticsearch-analysis-ik: Compilation failure
[ERROR] /D:/PersonalProjects/analysis-ik-7.17.11/analysis-ik-7.17.11/src/main/java/org/elasticsearch/index/analysis/IkAnalyzerProvider.java:[13,9] 无法将类 org.elasticsearch.index.analysis.AbstractIndexAnalyzerProvider<T>中的构造器
AbstractIndexAnalyzerProvider应用到给定类型;
[ERROR] 需要: org.elasticsearch.index.IndexSettings,java.lang.String,org.elasticsearch.common.settings.Settings
[ERROR] 找到: java.lang.String,org.elasticsearch.common.settings.Settings
修改代码报错部分:增加indexSetting参数到super入参的第一个位置

使用mvn clean install进行打包,注意我们所需的是/target/release目录下的.zip压缩包

3.3 安装ik分词插件
将下载或者编译后的.zip文件解压到es的安装目录下的plugins目录下,并重命名为ik

然后启动es,查看日志可发现已经加载的ik分词器

常规的最常用的使用方式就是,数据插入存储时用 ik_max_word模式分词,而检索时,用ik_smart模式分词,即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。
建立映射示例如下:在数据被索引时我们设置"analyzer": “ik_max_word”,在检索时指定"search_analyzer": “ik_smart”
4. 建立es索引
setting.json
{"aliases": {},"settings": {"index": {"refresh_interval": "3s","number_of_shards": "3","number_of_replicas": "1","max_inner_result_window": "10000","max_result_window": "20000","analysis": {"filter": {"pinyin_full_filter": {"keep_joined_full_pinyin": "true","lowercase": "true","keep_original": "false","keep_first_letter": "false","keep_separate_first_letter": "false","type": "pinyin","keep_none_chinese": "false","limit_first_letter_length": "50","keep_full_pinyin": "true"},"pinyin_simple_filter": {"keep_joined_full_pinyin": "true","lowercase": "true","none_chinese_pinyin_tokenize": "false","padding_char": " ","keep_original": "true","keep_first_letter": "true","keep_separate_first_letter": "false","type": "pinyin","keep_full_pinyin": "false"}},"analyzer": {"pinyinFullIndexAnalyzer": {"filter": ["asciifolding","lowercase","pinyin_full_filter"],"type": "custom","tokenizer": "ik_max_word"},"pinyinSimpleIndexAnalyzer": {"filter": ["pinyin_simple_filter","lowercase"],"type": "custom","tokenizer": "ik_max_word"},"ik_pinyin_analyzer": {"filter": ["asciifolding","lowercase","pinyin_full_filter","word_delimiter"],"type": "custom","tokenizer": "ik_smart"},"ikIndexAnalyzer": {"filter": ["asciifolding","lowercase","pinyin_full_filter","word_delimiter"],"type": "custom","tokenizer": "ik_max_word"}}}}},"mappings": {"dynamic": "false"}
}
mapping.json
{"properties": {"nickName": {"type": "text","analyzer": "ikIndexAnalyzer","search_analyzer": "ik_pinyin_analyzer","fields": {"full": {"type": "text","analyzer": "pinyinFullIndexAnalyzer"},"simple": {"type": "text","analyzer": "pinyinSimpleIndexAnalyzer"}}}}
}
mapping.json 文件定义了 Elasticsearch 索引中的字段映射和分析器设置:
-
analyzer:定义了在索引时使用的分析器。在搜索时会用这个分析器来处理查询字符串,使之与索引中的文本数据匹配。
ikIndexAnalyzer分析器使用了ik_max_word分词器(tokenizer),并应用了一系列过滤器(filter),包括 ASCII 折叠、小写转换、拼音处理和词分割。 -
search_analyzer:定义了在搜索时使用的分析器。
ik_pinyin_analyzer分析器用于处理查询字符串,在进行搜索时与索引中的数据进行匹配。 -
fields:定义了为同一个字段创建不同的索引方式。在这个示例中,为
nickName字段创建了两个额外的索引方式:full和simple。-
full:使用了
pinyinFullIndexAnalyzer分析器,它将nickName字段的文本进行全拼音分析,用于支持全拼音搜索。 -
simple:使用了
pinyinSimpleIndexAnalyzer分析器,它将nickName字段的文本进行简拼音分析,用于支持简拼音搜索。
-
5.测试检索
新增测试数据
PUT /zzt_works/_doc/2
{"nickName":"語法講義"
} PUT /zzt_works/_doc/3
{"nickName":"语法讲义"
}
中文简写查询

中文繁体查询

拼音全拼查询

拼音简拼查询

6. 繁简转换
如果需求只需要繁简转换,可使用以下设置和映射配置
index.json
{"aliases": {},"settings": {"index": {"refresh_interval": "3s","number_of_shards": "3","number_of_replicas": "1","max_inner_result_window": "10000","max_result_window": "20000","analysis": {"filter": {"pinyin_full_filter": {"keep_joined_full_pinyin": "true","lowercase": "true","keep_original": "false","keep_first_letter": "false","keep_separate_first_letter": "false","type": "pinyin","keep_none_chinese": "false","limit_first_letter_length": "50","keep_full_pinyin": "true"}},"analyzer": {"ik_pinyin_analyzer": {"filter": ["asciifolding","lowercase","pinyin_full_filter","word_delimiter"],"type": "custom","tokenizer": "ik_smart"},"ikIndexAnalyzer": {"filter": ["asciifolding","lowercase","pinyin_full_filter","word_delimiter"],"type": "custom","tokenizer": "ik_max_word"}}}}},"mappings": {"dynamic": "false"}
}
mapping.json
{"properties": {"nickName": {"type": "text","analyzer": "ikIndexAnalyzer","search_analyzer": "ik_pinyin_analyzer"}}
}
相关文章:
ES全文检索支持拼音和繁简检索
ES全文检索支持拼音和繁简检索 1. 实现目标2. 引入pinyin插件2.1 编译 elasticsearch-analysis-pinyin 插件2.2 安装拼音插件 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4. 建立es索引5.测试检索6. 繁简转换 1. 实现目标 ES检索时…...
【DDR 终端稳压器】Sink and Source DDR Termination Regulator [C] S0 S1 S2 S3 S4 S5 6状态
TPS51200A-Q1 器件通过 EN 功能提供 S3 支持。EN引脚可以连接到终端应用中的SLP_S3信号。当EN 高电平(S0 状态)时,REFOUT 和 VO 引脚均导通。当EN 低电平(S3状态)时,VO引脚关断并通过内部放电MOSFET放电时…...
使用IIS部署Vue项目
前提 使用IIS部署Vue项目,后端必须跨域,不要在Vue中用proxy跨域,那个只在dev环境中有用! IIS安装,不用全部打勾,有些他默认就是方块 ■ 选择性安装的,就维持原样就可以。 添加网站配置 右键…...
QT+多线程TCP服务器+进阶版
针对之前的服务器,如果子线程工作类里面需要使用socket发送消息,必须要使用信号与槽的方法, 先发送一个信号给父进程,父进程调用socket发送消息(原因是QT防止父子进程抢夺同一资源,因此直接规定父子进程不能…...
Java入门基础学习笔记12——变量详解
变量详解: 变量里的数据在计算机中的存储原理。 二进制: 只有0和1, 按照逢2进1的方式表示数据。 十进制转二进制的算法: 除二取余法。 6是110 13是1101 计算机中表示数据的最小单元:一个字节(byte&…...
bitmap requires a valid src attribute
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题记录四、 推…...
Java刷题-基础篇
目录 题目1:打印1~100内奇数和、偶数和 题目2:计算5的阶乘 题目3:计算 1!2!3!4!5! 的和 题目4:找1~100之间即能被3整除,又能被5整除的数字,要求必须使用break/continue 题目5:实现猜数字小…...
Linux——mysql运维篇
回顾基本语句: 数据定义语言 ( DDL ) 。这类语言用于定义和修改数据库的结构,包括创建、删除和修改数据库、表、视图和索引等对象。主要的语句关键字包括 CREATE 、 DROP 、 ALTER 、 RENAME 、 TRUNCATE 等。 create database 数据库 &…...
力扣每日一题-统计已测试设备-2024.5.10
力扣题目:统计已测试设备 题目链接: 2960.统计已测试设备 题目描述 代码思路 根据题目内容,第一感是根据题目模拟整个过程,在每一步中修改所有设备的电量百分比。但稍加思索,发现可以利用已测试设备的数量作为需要减少的设备电…...
代码+视频,R言语处理数据中的缺失值
在SCI论文中,我们不可避免和缺失数据打交道,特别是在回顾性研究,对于缺失的协变量(就是混杂因素),我们可以使用插补补齐数据,但是对于结局变量和原因变量的缺失,我们不能这么做。部分…...
PGSync安装使用教程(PostgreSQL数据实时同步至Elasticsearch)
说明 pgsync项目有两个,一个是ankane/pgsync,用于pgsql之间的数据同步,另一个是toluaina/pgsync,用于pgsql的数据同步至es,本教程适用于第二个项目。 pgsync应该是目前为止唯二支持es8的数据同步工具,另一…...
前端主题切换的多种方式
动态link标签加载不同主题css **原理:**提前准备好几套CSS主题样式文件,在点击切换主题时,创建link标签动态加载到head标签中,或者是动态改变link标签的href属性。 缺点: 动态加载样式文件,如果文件过大网…...
使用RESTful API构建 web 应用程序
RESTful API是一种基于HTTP协议的架构风格,用于设计网络应用程序的 API。它强调使用标准的HTTP方法(如GET、POST、PUT和DELETE)对资源进行操作,并使用统一的资源标识符(URI)来唯一标识每个资源。RESTful AP…...
KaiOS Data PDN 数据建立流程
代码逻辑 APN创建 在 DataCallManager.jsm中,会对所有apnsetting创建一个datacall,其中会包含dataprofile的成员(通过apn参数来创建),在之后的流程用于直接发送到modem建立PDN。 PDN建立 1、DataCallManager.jsm -dcInterface.setupDataCall //RILNetworkInterface.c…...
Mybatis-Plus常用的增删改查坑
添加依赖 <!--实体类上加上Data注解就不用写get,set,toString,equals等方法了--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional…...
初识指针(4)<C语言>
前言 前面的文章,已经对指针的基础概念以及运用有了初步了解,我们可以进一步探究指针比较深入的知识,下文将主要介绍:使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…...
pyqt 工具栏QToolBar控件
pyqt 工具栏QToolBar控件 QToolBar控件介绍效果代码 QToolBar控件介绍 QToolBar 是 PyQt(中的一个控件,它提供了一个工具栏,通常包含一系列的工具按钮或下拉菜单,用于提供对应用程序功能的快速访问。 QToolBar 通常与 QMainWind…...
SystemVerilog/Verilog中的仿真延时建模之模块路径延时
一 概要 模块路径延迟,描述的是模块中信号从源端到目的端传输的延迟。 路径以及对应的延迟是在模块中的specify块中指定的,其中信号源端一般为input或者inout,而目的端则只能为output或者inout.在specify中指定的模块路径,常见的形式主要三种,分别是: 简单路径(Simple Path…...
代码随想录算法训练营Day36 | 738.单调递增的数字、968.监控二叉树、贪心算法总结 | Python | 个人记录向
本文目录 738.单调递增的数字做题看文章 968.监控二叉树做题看文章 贪心算法总结以往忽略的知识点小结个人体会 738.单调递增的数字 代码随想录:738.单调递增的数字 Leetcode:738.单调递增的数字 做题 无思路。 看文章 例如:98ÿ…...
FME学习之旅---day26
我们付出一些成本,时间的或者其他,最终总能收获一些什么。 【由于上周,上班状态不是很好,事情多又杂,没有学习的劲头,就短暂的休息了一下下。双休爬山,给自己上了强度,今天才缓过来…...
PageHelper与民航电子数据库兼容性实战:从报错到完美分页的完整流程
PageHelper与民航电子数据库兼容性实战:从报错到完美分页的完整流程 最近在将PageHelper分页插件接入民航电子数据库时,遇到了一个典型的兼容性问题。当代码执行到PageHelper.startPage()方法时,控制台抛出com.github.pagehelper.PageExcepti…...
掌握小程序逆向工具:wxapkg解析与代码还原全流程指南
掌握小程序逆向工具:wxapkg解析与代码还原全流程指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 当你需要逆向分析小程序包时,是否遇到过这些痛点?wxapkg文件无法直接查看内容、…...
如何高效获取网页媒体资源:猫抓插件的全方位技术指南
如何高效获取网页媒体资源:猫抓插件的全方位技术指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代,我们每天都会遇到想要保存的视频、音频和图片资源。…...
OpenClaw 的模型推理是否支持异步非阻塞调用?如何实现?
在讨论OpenClaw模型推理是否支持异步非阻塞调用之前,不妨先回想一下日常生活中的一个场景。假设你需要同时处理几件事:一边用洗衣机洗衣服,一边在厨房煮汤,同时还在回复工作邮件。如果这三件事必须一件接一件地做,等衣…...
如何让旧款Mac焕发新生:OpenCore Legacy Patcher终极指南
如何让旧款Mac焕发新生:OpenCore Legacy Patcher终极指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方"遗忘"的旧款Mac&a…...
5个技巧让CUDA应用在非NVIDIA显卡发挥最大价值——ZLUDA完全指南
5个技巧让CUDA应用在非NVIDIA显卡发挥最大价值——ZLUDA完全指南 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 在AI与高性能计算领域,CUDA生态的垄断地位让许多开发者和企业面临硬件选择困境。跨平台…...
OpenClaw多模型路由策略:百川2-13B与CodeLlama任务分配逻辑
OpenClaw多模型路由策略:百川2-13B与CodeLlama任务分配逻辑 1. 为什么需要多模型路由? 去年我在搭建个人AI助手时遇到一个典型问题:当我把所有任务都交给同一个大模型处理时,发现代码生成任务的质量总是不尽如人意。后来通过日志…...
AI结对编程:利用快马平台智能助手深度理解和优化PyTorch代码
最近在折腾PyTorch项目时,发现很多细节问题光靠查文档效率太低。后来尝试用InsCode(快马)平台的AI辅助功能,发现它不仅能解释代码原理,还能直接给出优化方案,简直是深度学习开发的"外挂"。分享几个实用场景:…...
使用PyInstaller打包yz-女生-角色扮演-造相Z-Turbo模型为可执行文件
使用PyInstaller打包yz-女生-角色扮演-造相Z-Turbo模型为可执行文件 1. 引言 想象一下,你开发了一个很酷的AI应用,基于yz-女生-角色扮演-造相Z-Turbo模型,可以生成精美的二次元角色图片。现在你想分享给朋友或用户使用,但他们可…...
致所有嵌入式学习者:一些比代码更重要的东西
文 / 一只会飞的猫 本文已经加入原创侵权保护,商业行为,禁止任何形式转载,违者必究。 文章所在专栏:嵌入式入行认知指南—芯片老兵带你打破学习信息差 文章目录1 为什么我要写这个专栏2 在这个专栏里,你会了解到什么&a…...
