1. 使用场景介绍

搜索功能支持拼音检索、中文检索、拼音中文混合检索。

例如,输入 l德h

  • 期望结果:刘德华、刘德华4
  • 不期望结果:刘得华、刘的华

2. 下载 pinyin 插件

github地址
注意:下载的版本需与自己的 ES 版本一致。

3. 修改插件源码及安装

注意事项:

  1. v7.13.1 已原生支持拼音中文混合检索,可直接安装使用。
  2. v7.9.3 及以下版本需手动修改源码,步骤如下:
    • 下载 v7.9.3v7.13.1 两份源码
    • 通过 compare 对比,将 v7.13.1 中新增的代码合入 v7.9.3
    • 修改 pom.xml 中的 elasticsearch.version7.9.3
    • 执行 mvn clean package 打包
    • 将生成的 elasticsearch-analysis-pinyin-7.9.3.zip 解压到 plugins/analysis-pinyin 目录下

4. 测试

创建索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
############################创建索引#########################
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"pinyin_chinese_analyzer": {
"tokenizer": "pinyin_tokenizer"
},
"pinyin_analyzer": {
"tokenizer": "pinyin_chinese_tokenizer"
}
},
"tokenizer": {
"pinyin_chinese_tokenizer": {
"type": "pinyin",
"keep_first_letter": false,
"keep_separate_first_letter": false,
"keep_full_pinyin":false,
"keep_original":false,
"limit_first_letter_length":50,
"keep_separate_chinese": true,
"lowercase":true

},
"pinyin_tokenizer": {
"type": "pinyin",
"keep_first_letter": false,
"keep_separate_first_letter": true,
"keep_full_pinyin":true,
"keep_original":false,
"limit_first_letter_length":50,
"keep_separate_chinese": true,
"lowercase":true
}
}
}
}
}

查询索引

1
GET /_cat/indices

Mapping 设置

1
2
3
4
5
6
7
8
9
10
POST /my_index/_mapping 
{
"properties": {
"name": {
"type": "text",
"analyzer": "pinyin_chinese_analyzer",
"search_analyzer": "pinyin_analyzer"
}
}
}

查询 Mapping 设置是否生效

1
GET /my_index/_mapping?pretty

测试索引下定义的分词器

1
2
3
4
5
6
7
8
9
10
11
GET /my_index/_analyze
{
"text": ["刘德华"],
"analyzer": "pinyin_chinese_analyzer"
}

GET /my_index/_analyze
{
"text": ["刘德h"],
"analyzer": "pinyin_analyzer"
}

创建数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /my_index/_doc/1
{"name":"刘德华"}

PUT /my_index/_doc/2
{"name":"刘的华"}

PUT /my_index/_doc/3
{"name":"刘得华"}

PUT /my_index/_doc/4
{"name":"刘德华4"}

PUT /my_index/_doc/5
{"name":"刘5德5华5"}

查询所有数据

1
2
3
4
5
6
GET /my_index/_search
{
"query": {
"match_all": {}
}
}

拼音中文混合检索

1
2
3
4
5
6
7
8
GET /my_index/_search
{
"query": {
"match_phrase": {
"name": "l德h"
}
}
}