ES之道:IK分词器的魔法般变身
- 前言
- IK分词器简介
- IK分词器原理
- 创建索引和配置IK分词器
- 实战(docker搭建的Es)
- 下载ik插件
- 创建一个ik分词器的索引
- 如果希望将原来的索引覆盖
- 重新索引数据
- 删除旧索引重新命名新索引
- 报错解决
前言
在数据的世界里,搜索就像是一位智慧的导航员,它能够帮助我们在海量信息中找到需要的答案。而Elasticsearch,就像是这位导航员的得力助手,它通过强大的文本处理能力,为我们提供了一个高效的搜索引擎。而IK分词器,则是Elasticsearch中的一枚利器,它能够帮助我们实现中文文本的精确分词和搜索。今天,就让我们一起来揭开IK分词器的神秘面纱,探索它在Elasticsearch中的魔法般变身吧!
IK分词器简介
IK 分词器是一个针对中文文本的开源分词器,特别适用于中文搜索引擎和文本分析领域。它的作用是将中文文本按照一定的规则进行切分,将连续的字符序列划分为具有语义的词语,从而实现中文文本的分词处理。
重要性:
- 中文分词的基础工具: 在中文文本处理领域,分词是非常基础且重要的工作。IK 分词器提供了一个高效准确的分词工具,为中文文本的处理提供了基础支持。
- 提高搜索效果: 在搜索引擎等应用中,分词的质量直接影响搜索结果的准确性和用户体验。使用 IK 分词器可以提高搜索引擎的检索效果,使用户能够更快速准确地找到所需信息。
- 支持领域专业词汇: IK 分词器支持用户自定义词典,可以灵活地增加领域专业词汇,提高分词的准确性和适用性。
与其他分词器的区别:
- 精准度和速度: IK 分词器在中文文本处理领域具有较高的精准度和速度,能够快速准确地进行分词处理。
- 自定义词典支持: IK 分词器支持用户自定义词典,可以灵活增加领域专业词汇,提高分词效果。一些其他分词器也支持自定义词典,但不是所有分词器都具备这个功能。
- 开源社区支持: IK 分词器是一个开源项目,有着活跃的开发社区和用户社区,可以获得丰富的技术支持和资源共享。
IK分词器原理
IK 分词器的分词原理基于中文文本的规则和词典匹配,主要包括正向最大匹配和逆向最大匹配两种算法。以下是 IK 分词器的基本工作流程:
-
正向最大匹配(Forward Maximum Matching):
- 正向最大匹配从文本的开头开始,按照最大匹配的原则进行切分。即从当前位置开始,选择最长的词语进行匹配,并将匹配成功的词语作为分词结果。
- 此过程会在词典中查找匹配的词语,如果找到匹配的词语,则将其作为分词结果;如果没有找到匹配的词语,则缩小匹配窗口,继续查找下一个最长的词语。
- 分词过程会重复执行,直到处理完整个文本。
-
逆向最大匹配(Reverse Maximum Matching):
- 逆向最大匹配从文本的末尾开始,按照最大匹配的原则进行切分。即从当前位置开始,选择最长的词语进行匹配,并将匹配成功的词语作为分词结果。
- 此过程同样会在词典中查找匹配的词语,如果找到匹配的词语,则将其作为分词结果;如果没有找到匹配的词语,则缩小匹配窗口,继续查找下一个最长的词语。
- 分词过程会重复执行,直到处理完整个文本。
-
合并分词结果:
- 正向最大匹配和逆向最大匹配得到的分词结果可能不同,因此需要进行合并。
- 通常情况下,可以选择分词结果中词数较少的作为最终结果,或者根据一定的评分算法来选择最合适的分词结果。
-
处理未登录词:
- IK 分词器支持用户自定义词典,用户可以添加自己的词汇到词典中。当分词器无法识别某些词语时,会尝试在用户词典中查找匹配的词汇。
总体而言,IK 分词器通过正向最大匹配和逆向最大匹配两种算法来切分中文文本,并结合用户自定义词典进行分词处理,从而实现对中文文本的准确分词。
创建索引和配置IK分词器
在 Elasticsearch 中创建索引并配置 IK 分词器,可以通过以下步骤完成:
-
创建索引: 首先,在 Elasticsearch 中创建一个新的索引,可以使用 Elasticsearch 的 REST API 或者 Kibana 工具进行操作。
-
配置 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"
报错解决
-
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"