ES之道:IK分词器的魔法般变身

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ES之道:IK分词器的魔法般变身

前言

在数据的世界里,搜索就像是一位智慧的导航员,它能够帮助我们在海量信息中找到需要的答案。而Elasticsearch,就像是这位导航员的得力助手,它通过强大的文本处理能力,为我们提供了一个高效的搜索引擎。而IK分词器,则是Elasticsearch中的一枚利器,它能够帮助我们实现中文文本的精确分词和搜索。今天,就让我们一起来揭开IK分词器的神秘面纱,探索它在Elasticsearch中的魔法般变身吧!

IK分词器简介

IK 分词器是一个针对中文文本的开源分词器,特别适用于中文搜索引擎和文本分析领域。它的作用是将中文文本按照一定的规则进行切分,将连续的字符序列划分为具有语义的词语,从而实现中文文本的分词处理。

重要性:

  1. 中文分词的基础工具: 在中文文本处理领域,分词是非常基础且重要的工作。IK 分词器提供了一个高效准确的分词工具,为中文文本的处理提供了基础支持。
  2. 提高搜索效果: 在搜索引擎等应用中,分词的质量直接影响搜索结果的准确性和用户体验。使用 IK 分词器可以提高搜索引擎的检索效果,使用户能够更快速准确地找到所需信息。
  3. 支持领域专业词汇: IK 分词器支持用户自定义词典,可以灵活地增加领域专业词汇,提高分词的准确性和适用性。

与其他分词器的区别:

  1. 精准度和速度: IK 分词器在中文文本处理领域具有较高的精准度和速度,能够快速准确地进行分词处理。
  2. 自定义词典支持: IK 分词器支持用户自定义词典,可以灵活增加领域专业词汇,提高分词效果。一些其他分词器也支持自定义词典,但不是所有分词器都具备这个功能。
  3. 开源社区支持: IK 分词器是一个开源项目,有着活跃的开发社区和用户社区,可以获得丰富的技术支持和资源共享。

IK分词器原理

IK 分词器的分词原理基于中文文本的规则和词典匹配,主要包括正向最大匹配和逆向最大匹配两种算法。以下是 IK 分词器的基本工作流程:

  1. 正向最大匹配(Forward Maximum Matching):
  • 正向最大匹配从文本的开头开始,按照最大匹配的原则进行切分。即从当前位置开始,选择最长的词语进行匹配,并将匹配成功的词语作为分词结果。
  • 此过程会在词典中查找匹配的词语,如果找到匹配的词语,则将其作为分词结果;如果没有找到匹配的词语,则缩小匹配窗口,继续查找下一个最长的词语。
  • 分词过程会重复执行,直到处理完整个文本。
  1. 逆向最大匹配(Reverse Maximum Matching):
  • 逆向最大匹配从文本的末尾开始,按照最大匹配的原则进行切分。即从当前位置开始,选择最长的词语进行匹配,并将匹配成功的词语作为分词结果。
  • 此过程同样会在词典中查找匹配的词语,如果找到匹配的词语,则将其作为分词结果;如果没有找到匹配的词语,则缩小匹配窗口,继续查找下一个最长的词语。
  • 分词过程会重复执行,直到处理完整个文本。
  1. 合并分词结果:
  • 正向最大匹配和逆向最大匹配得到的分词结果可能不同,因此需要进行合并。
  • 通常情况下,可以选择分词结果中词数较少的作为最终结果,或者根据一定的评分算法来选择最合适的分词结果。
  1. 处理未登录词:
  • IK 分词器支持用户自定义词典,用户可以添加自己的词汇到词典中。当分词器无法识别某些词语时,会尝试在用户词典中查找匹配的词汇。

总体而言,IK 分词器通过正向最大匹配和逆向最大匹配两种算法来切分中文文本,并结合用户自定义词典进行分词处理,从而实现对中文文本的准确分词。

创建索引和配置IK分词器

在 Elasticsearch 中创建索引并配置 IK 分词器,可以通过以下步骤完成:

  1. 创建索引: 首先,在 Elasticsearch 中创建一个新的索引,可以使用 Elasticsearch 的 REST API 或者 Kibana 工具进行操作。
  2. 配置 IK 分词器: 针对需要进行中文分词的字段,配置相应的 IK 分词器。

下面是一个示例,演示如何使用 Elasticsearch 的 REST API 在创建索引时配置 IK 分词器:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "ik_max_word", // 使用 IK 分词器 ik_max_word
          "filter": ["my_synonym_filter"] // 可选:添加同义词过滤器
        }
      },
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms_path": "analysis/synonyms.txt" // 同义词文件路径
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_analyzer" // 使用自定义的 IK 分词器
      }
    }
  }
}

在上面的示例中:

  • 创建了一个名为 my_index 的索引。
  • 在索引的设置中,定义了一个名为 my_analyzer 的分析器,使用 IK 分词器 ik_max_word 进行分词,并且可以选择添加同义词过滤器。
  • 创建了一个 content 字段,并将其配置为使用自定义的 IK 分词器 my_analyzer 进行分词。

常见的 IK 分词器配置示例包括:

  • ik_max_word:最大化地切分词语,适合搜索应用。
  • ik_smart:精准地切分词语,适合索引和分析应用。

根据实际需求,可以选择合适的 IK 分词器进行配置,并根据需要添加额外的分词器设置,如同义词过滤器等。

实战(docker搭建的Es)

下载ik插件

docker搭建的Es如果下载ik分词器插件可以执行以下命令,下面的版本要选择你的es版本

docker exec -it your_elasticsearch_container_name /bin/bash -c "elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.3/elasticsearch-analysis-ik-7.16.3.zip"

创建一个ik分词器的索引

curl -XPUT "http://localhost:9200/acowbo_new" -H 'Content-Type: application/json' -d '
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase"]
        },
        "ik_analyzer": {
          "type": "custom",
          "tokenizer": "ik_smart"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "searchKey": {
        "type": "text",
        "analyzer": "ik_analyzer"
      },
      "searchValue": {
        "type": "text",
        "analyzer": "ik_analyzer"
      },
      "typeName": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}'

如果希望将原来的索引覆盖

重新索引数据
curl -XPOST "http://localhost:9200/_reindex" -H 'Content-Type: application/json' -d '
{
  "source": {
    "index": "acowbo"
  },
  "dest": {
    "index": "acowbo_new"
  }
}'
删除旧索引重新命名新索引
curl -XDELETE "http://localhost:9200/acowbo"
curl -XPOST "http://localhost:9200/acowbo_new/_alias/acowbo"

报错解决

  1. Can’t update non dynamic settings [[index.analysis.analyzer.my_analyzer.type, index.analysis.analyzer.my_analyzer.filter, index.analysis.analyzer.ik_analyzer.tokenizer, index.analysis.analyzer.my_analyzer.tokenizer, index.analysis.analyzer.ik_analyzer.type]] for open indices
Elasticsearch不允许直接更新这些非动态设置。
curl -XPOST "http://localhost:9200/acowbo/_close"


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
5月前
|
机器学习/深度学习 自然语言处理 算法
必知的技术知识:IK分词器实现原理剖析——一个小问题引发的思考
必知的技术知识:IK分词器实现原理剖析——一个小问题引发的思考
154 0
|
6月前
GPTs每日推荐--生化危机【典藏版】
GPTs每日推荐--生化危机【典藏版】
45 1
|
6月前
|
数据采集 存储 自然语言处理
【大模型】公主大人,别再用jieba做分词了!看看隔壁ChatGLM用了什么高科技!
【大模型】公主大人,别再用jieba做分词了!看看隔壁ChatGLM用了什么高科技!
127 0
|
自然语言处理 应用服务中间件
43分布式电商项目 - 中文分词器IK Analyzer配置
43分布式电商项目 - 中文分词器IK Analyzer配置
73 0
|
自然语言处理 搜索推荐 索引
白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
128 0
|
自然语言处理 安全 关系型数据库
白话Elasticsearch30-IK中文分词之热更新IK词库
白话Elasticsearch30-IK中文分词之热更新IK词库
201 0
|
缓存 C语言
庖丁解C2.0
如果所有case语句都不符合要求,就要多设置一个入口处理数据就要用default,default位置可以放在任何位置但是一般都放在最以后(先处理正常的,再处理其他的)
115 0
庖丁解C2.0
|
C语言
庖丁解C1.0
大括号{}里的叫局部变量,外头的叫全局变量
85 0
|
数据安全/隐私保护 C语言
庖丁解C 3.0
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
70 0
|
自然语言处理 搜索推荐 前端开发
当BERT遇上搜索引擎
当BERT遇上搜索引擎
当BERT遇上搜索引擎