共计 2645 个字符,预计需要花费 7 分钟才能阅读完成。
1、背景
个别状况下,有些搜寻需要是须要依据 拼音
和中文
来搜寻的,那么在 elasticsearch
中是如何来实现基于 拼音
来搜寻的呢?能够通过 elasticsearch-analysis-pinyin
分析器来实现。
2、装置拼音分词器
# 进入 es 的插件目录
cd /usr/local/es/elasticsearch-8.4.3/plugins
# 下载
wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v8.4.3/elasticsearch-analysis-pinyin-8.4.3.zip
# 新建目录
mkdir analysis-pinyin
# 解压
mv elasticsearch-analysis-pinyin-8.4.3.zip analysis-pinyin && cd analysis-pinyin && unzip elasticsearch-analysis-pinyin-8.4.3.zip && rm -rvf elasticsearch-analysis-pinyin-8.4.3.zip
cd ../ && chown -R es:es analysis-pinyin
# 启动 es
/usr/local/es/elasticsearch-8.4.3/bin/elasticsearch -d
3、拼音分词器提供的性能
拼音分词器提供如下性能
每个选项的含意
能够通过 文档中的例子来看懂。
4、简略测试一下拼音分词器
4.1 dsl
GET _analyze
{"text": ["我是中国人"],
"analyzer": "pinyin"
}
"analyzer": "pinyin"
此处的 pinyin
是拼音分词器自带的。
4.2 运行后果
从图片上,实现了拼音分词,然而这个不肯定满足咱们的需要,比方没有中文了,单个的拼音 (比方:wo) 是没有什么用的,须要对拼音分词器进行定制化。
5、es 中分词器的组成
在 elasticsearch
中分词器 analyzer
由如下三个局部组成:
character filters:
用于在tokenizer
之前对文本进行解决。比方:
删除字符,替换字符等。tokenizer:
将文本依照肯定的规定分成独立的 token。即实现分词性能。tokenizer filter:
将tokenizer
输入的词条做进一步的解决。比方:
同义词解决,大小写转换、移除停用词,拼音解决等。
6、自定义一个分词器实现拼音和中文的搜寻
需要:
自定义一个分词器,即能够实现拼音搜寻,也能够实现中文搜索。
1、创立 mapping
PUT /test_pinyin
{
"settings": {
// 分析阶段的设置
"analysis": {
// 分析器设置
"analyzer": {
// 自定义分析器,在 tokenizer 阶段应用 ik_max_word,在 filter 上应用 py
"custom_analyzer": {
"tokenizer": "ik_max_word",
"filter": "custom_pinyin"
}
},
// 因为不满足 pinyin 分词器的默认设置,所以咱们基于 pinyin
// 自定义了一个 filter,叫 py,其中批改了一些设置
// 这些设置能够在 pinyin 分词器官网找到
"filter": {
"custom_pinyin": {
"type": "pinyin",
// 不会这样分:刘德华 > [liu, de, hua]
"keep_full_pinyin": false,
// 这样分:刘德华 > [liudehua]
"keep_joined_full_pinyin": true,
// 保留原始 token(即中文)"keep_original": true,
// 设置 first_letter 后果的最大长度,默认值:16
"limit_first_letter_length": 16,
// 当启用此选项时,将删除反复项以保留索引,例如:de 的 > de,默认值:false,留神:地位相干查问可能受影响
"remove_duplicated_term": true,
// 如果非汉语字母是拼音,则将其拆分为独自的拼音术语,默认值:true,如:liudehuaalibaba13zhuanghan- > liu,de,hua,a,li,ba,ba,13,zhuang,han,留神:keep_none_chinese 和 keep_none_chinese_together 应首先启用
"none_chinese_pinyin_tokenize": false
}
}
}
},
// 定义 mapping
"mappings": {
"properties": {
"name": {
"type": "text",
// 创立倒排索引时应用的分词器
"analyzer": "custom_analyzer",
// 搜寻时应用的分词器,搜寻时不应用 custom_analyzer 是为了避免 词语的拼音一样,然而中文含意不一样,导致搜寻谬误。比方:科技 和 客机,拼音一样,然而含意不一样
"search_analyzer": "ik_smart"
}
}
}
}
留神:
能够看到 咱们的 name
字段 应用的分词器是 custom_analyzer
,这个是咱们在上一步定义的。然而搜寻的时候应用的是 ik_smart
,这个为甚么会这样呢?
假如咱们存在如下 2 个文本 科技强国
和 这是一架客机
,那么 科技
和客机
的拼音是不是就是一样的。这个时候如果搜寻时应用的分词器也是 custom_analyzer
那么,搜寻 科技
的时候 客机
也会搜寻进去,这样是不对的。因而在搜寻的时候中文就以中文搜,拼音就以拼音搜。
{
"name": {
"type": "text",
"analyzer": "custom_analyzer",
"search_analyzer": "ik_smart"
}
}
当 analyzer
和 search_analyzer
的值都是custom_analyzer
,搜寻时也会通过拼音搜寻,这样的后果可能就不是咱们想要的。
2、插入数据
PUT /test_pinyin/_bulk
{"index":{"_id":1}}
{"name": "科技强国"}
{"index":{"_id":2}}
{"name": "这是一架客机"}
{"index":{"_id":3}}
3、搜寻数据
7、参考文档
1、https://github.com/medcl/elasticsearch-analysis-pinyin/tree/master