ES全文检索支持繁简和IK分词检索

1. 前言

在现代信息检索中,处理不同语言的变体和实现高效的全文检索是一个重要的需求。对于中文,特别是需要处理简体和繁体的转换,以及高效的分词处理,这就显得尤为重要。ElasticSearch(ES)作为一个分布式全文搜索引擎,提供了强大的文本搜索和分析能力,但默认情况下并不支持简繁转换和高级的中文分词。因此,我们需要通过一些插件和自定义设置来实现这一功能。

本教程旨在展示如何在ES中引入繁简转换和IK分词插件,使得在检索时无论输入简体还是繁体都能够被检索到。无论用户输入“語法”还是“语法”,检索结果中都能命中包含简体和繁体的相关文档。这种处理方式不仅提升了用户体验,还增强了检索的准确性和全面性。

通过引入分析插件analysis-stconvert和分词插件analysis-ik,并结合自定义的ES配置,我们可以实现这一目标。以下将详细介绍如何下载、编译、安装这些插件,并通过示例展示如何建立支持繁简转换和IK分词的ES索引,最后通过实际数据插入和检索验证配置的效果。

2. 引入繁简转换插件analysis-stconvert

插件地址: https://github.com/infinilabs/analysis-stconvert/releases

2.1 下载已有作者编译后的包文件

如果存在可直接使用的zip文件,选择与自己版本一致的版本在这里插入图片描述

2.2 下载源码进行编译

如果没有下载即可使用的安装包,需要自己下载源码进行编译。下载打开后使用mvn clean install进行打包

image-20240621135510851

如果报错信息如下:

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /E:/project/PersonalProjects/analysis-stconvert-7.17.11/analysis-stconvert-7.17.11/src/main/java/org/elasticsearch/index/analysis/STConvertAnalyzerProvider.java:[28,9] 无法将类 org.elasticsearch.index.analysis.AbstractIndexA
nalyzerProvider<T>中的构造器 AbstractIndexAnalyzerProvider应用到给定类型;
  需要: org.elasticsearch.index.IndexSettings,java.lang.String,org.elasticsearch.common.settings.Settings
  找到: java.lang.String,org.elasticsearch.common.settings.Settings
  原因: 实际参数列表和形式参数列表长度不同
[ERROR] /E:/project/PersonalProjects/analysis-stconvert-7.17.11/analysis-stconvert-7.17.11/src/main/java/org/elasticsearch/index/analysis/STConvertTokenFilterFactory.java:[31,9] 无法将类 org.elasticsearch.index.analysis.AbstractToke
nFilterFactory中的构造器 AbstractTokenFilterFactory应用到给定类型;
  需要: org.elasticsearch.index.IndexSettings,java.lang.String,org.elasticsearch.common.settings.Settings
  找到: java.lang.String,org.elasticsearch.common.settings.Settings
  原因: 实际参数列表和形式参数列表长度不同
[ERROR] /E:/project/PersonalProjects/analysis-stconvert-7.17.11/analysis-stconvert-7.17.11/src/main/java/org/elasticsearch/index/analysis/STConvertCharFilterFactory.java:[34,9] 无法将类 org.elasticsearch.index.analysis.AbstractCharF
ilterFactory中的构造器 AbstractCharFilterFactory应用到给定类型;
  需要: org.elasticsearch.index.IndexSettings,java.lang.String
  找到: java.lang.String
  原因: 实际参数列表和形式参数列表长度不同
[INFO] 3 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE

下面类中,增加如下参数,标红报错不需要处理仍可以打包成功

image-20240621141224356

打包成功后可以在项目目录\target\releases看到编译后的压缩包elasticsearch-analysis-stconvert-7.17.11.zip

image-20240621141327596

2.3 复制解压插件到es安装目录的plugins文件夹下

image-20240621142124582

es数据库启动时会自动加载插件,如下输出即表示引入成功

image-20240621142402756

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模式分词,即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。

4. 建立IK和繁简集成的es索引

PUT http://localhost:9200/test/
{
  "aliases": {
  },
  "settings": {
    "index": {
      "refresh_interval": "3s",
      "number_of_shards": "3",
      "number_of_replicas": "1",
      "max_inner_result_window": "10000",
      "max_result_window": "20000",
      "analysis": {
        "analyzer": {
          "ik_max_word_convert": {
            "type": "custom",
            "char_filter": [
              "tsconvert",
              "stconvert"
            ],
            "tokenizer": "ik_max_word",
            "filter": [
              "lowercase"
            ]
          },
          "ik_smart_convert": {
            "type": "custom",
            "char_filter": [
              "tsconvert",
              "stconvert"
            ],
            "tokenizer": "ik_smart",
            "filter": [
              "lowercase"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "otherTitle": {
        "type": "text",
        "analyzer": "ik_max_word_convert",
        "search_analyzer": "ik_smart_convert"
      }
    }
  }
}

analysis部分定义了自定义分析器:

  • ik_max_word_convert:
    • type: "custom" :定义一个自定义分析器。
    • char_filter:
      • tsconvert: 自定义字符过滤器(用于繁体到简体转换)。
      • stconvert: 自定义字符过滤器(用于简体到繁体转换)。
    • tokenizer: "ik_max_word" - 使用IK分析器的最大词语分割。
    • filter: ["lowercase"] - 将所有字符转换为小写。
  • ik_smart_convert:
    • type: "custom"
    • char_filter:
      • tsconvert
      • stconvert
    • tokenizer: "ik_smart"
    • filter: ["lowercase"]

5. 新增数据测试检索

新增测试数据

PUT /test/_doc/2
{
 "nickName":"語法講義"
} 

PUT /test/_doc/3
{
 "nickName":"语法讲义"
} 

中文简写查询

image-20240621145358721

中文繁体查询

image-20240621145557738

通过上述配置和测试,我们可以看到无论是简体输入还是繁体输入,ES都能正确检索到相关文档。这证明了我们引入的繁简转换和IK分词插件的有效性,以及自定义分析器配置的正确性

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: ElasticsearchIK分词器是一种中文分词器,可以将中文文本分成一个个有意义的词语,以便于搜索和分析。它支持细粒度和粗粒度两种分词模式,可以根据不同的需求进行配置。IK分词器还支持自定义词典和停用词,可以提高分词的准确性和效率。在Elasticsearch中,IK分词器是非常常用的中文分词器之一。 ### 回答2: Elasticsearch是一个开源的搜索引擎,旨在提供实时搜索和分析功能。作为强大的搜索引擎,Elasticsearch极大的依赖于高效的分词器。而其中IK分词器是目前常见的分词器之一。 IK分词器是一款用于中文分词的工具。它采用了一种基于规则和词库相结合的分词算法。通常情况下,IK分词器的工作流程是:首先,将文本按照信息增益、词频、文本跨度等属性计算得到其初始的分词结果。然后,IK分词器通过对分词结果进行多轮处理,逐渐优化分词结果,以达到更为准确、严谨的分词效果。 此外,IK分词器还具备一些较为强大的功能。例如,支持中文姓名、词语拼音、数字、英文、日文等的分词处理。支持自定义词典、停用词、同义词等配置。支持了多种分词模式,如细粒度分词模式,搜索引擎分词模式和最少分词模式等等。这些功能的不断完善和升级,使IK分词器逐渐成为在中文文本分析领域常用的分词器之一。 总体来说,IK分词器在Elasticsearch中的应用是非常广泛的,它不仅能够提高搜索效果,而且还能加强文本拓展和分析的功能。随着数据量的不断增长和应用场景的不断拓展,对于一款高效、灵活的分词器的需求越来越大。相信IK分词器在未来的应用中,会有更加广泛的空间和应用。 ### 回答3: Elasticsearchik分词器是一种常用的中文全文检索分词器,能够对中文文本进行分词,将整篇文本划分成有意义的词语,并且支持多种分词模式。 该分词器的优点在于,它采用了基于词典和规则的分词算法,对中文分词效果非常好,特别是对于一些细分领域的专业术语等难分难识的词汇,在ik分词器的支持下也能够准确地被识别和分词。另外,ik分词器还支持自定义词典,可以根据应用场景自定义添加词汇,进一步提高分词效果和搜索准确率。 除此之外,ik分词器还支持多种分词模式,包括最细粒度分词模式、普通分词模式、搜索分词模式和面向中文搜索的ik_smart分词模式等,可以根据实际需求进行选择和配置。 总之,ik分词器是Elasticsearch中一个非常实用的中文分词组件,对于中文全文检索和搜索应用具有重要的作用,可以提高搜索效果、加速搜索响应速度,为用户提供更加优质的搜索服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐州蔡徐坤

又要到饭了兄弟们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值