ES全文检索支持拼音和繁简检索

2024-04-30 13:52

本文主要是介绍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检索时无论输入简体还是繁体都要能够被检索到,例如检索时输入“語法”或者“语法”,检索结果中无论是简体繁体都务必要被命中。

并且也要正确的高亮返回

image-20240429162129485

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文件

image-20240421170408043

3.2 只有源代码的版本

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

image-20240421172009705

使用 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入参的第一个位置

image-20240421172326529

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

image-20240421172441311

3.3 安装ik分词插件

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

image-20240421173223669

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

image-20240421173516905

常规的最常用的使用方式就是,数据插入存储时用 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 索引中的字段映射和分析器设置:

  1. analyzer:定义了在索引时使用的分析器。在搜索时会用这个分析器来处理查询字符串,使之与索引中的文本数据匹配。ikIndexAnalyzer 分析器使用了 ik_max_word 分词器(tokenizer),并应用了一系列过滤器(filter),包括 ASCII 折叠、小写转换、拼音处理和词分割。

  2. search_analyzer:定义了在搜索时使用的分析器。ik_pinyin_analyzer分析器用于处理查询字符串,在进行搜索时与索引中的数据进行匹配。

  3. fields:定义了为同一个字段创建不同的索引方式。在这个示例中,为 nickName 字段创建了两个额外的索引方式:fullsimple

    • full:使用了 pinyinFullIndexAnalyzer 分析器,它将 nickName 字段的文本进行全拼音分析,用于支持全拼音搜索。

    • simple:使用了 pinyinSimpleIndexAnalyzer 分析器,它将 nickName 字段的文本进行简拼音分析,用于支持简拼音搜索。

5.测试检索

新增测试数据

PUT /zzt_works/_doc/2
{"nickName":"語法講義"
} PUT /zzt_works/_doc/3
{"nickName":"语法讲义"
} 

中文简写查询

image-20240429173124264

中文繁体查询

image-20240429173158053

拼音全拼查询

image-20240429173256512

拼音简拼查询

image-20240429173352106

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全文检索支持拼音和繁简检索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949043

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立