自动补全 & (自定义)拼音分词器 & 搜索时注意事项

自动补全:

要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.

用初始化的拼音分词器进行分词:

为了实现得到的分词有中文也有拼音,我门需要

自定义拼音分词器(中文 + 拼音)

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
// 自定义拼音分词器
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}

测试方式1:

1
2
3
4
5
6
# 测试 自定义的分词器 的方式1
POST /test/_analyze
{
"text": ["如家酒店还不错"],
"analyzer": "my_analyzer"
}

测试 自定义的分词器 的方式2: 先添加两个 拼音相同的 字段, 后搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 测试 自定义的分词器 的方式2
#先添加两个 拼音相同的 字段, 后搜索
POST /test/_doc/1
{
"id": 1,
"name": "狮子"
}

POST /test/_doc/2
{
"id": 2,
"name": "虱子"
}

GET /test/_search
{
"query": {
"match": {
"name": "shizi"
}
}
}

注意事项:

    问题:当我用自定义的拼音分词器去搜索一段又狮子的中文时,却也搜出了库里面的的虱子,因为“狮子”和“虱子”有着相同的拼音,而拼音分词器就是可以将相同拼音的中文都搜出来

解决:

  为了避免搜索到同拼音字,搜索时不要用拼音分词器

删库,重设置和重建索引库,再重新测试上面的测试方式2就可以了

代码:

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
//删除库
DELETE /test

// 自定义拼音分词器
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "ik_smart"
}
}
}
}

测试(和上面的测试方式2一样):

总结:

DSL实现自动补全查询:

(45条消息) DSL实现自动补全查询_其然乐衣的博客-CSDN博客