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.zipcd ../ && 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由如下三个局部组成:

  1. character filters: 用于在tokenizer之前对文本进行解决。比方:删除字符,替换字符等。
  2. tokenizer: 将文本依照肯定的规定分成独立的token。即实现分词性能。
  3. 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"  }}

analyzersearch_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