前言
现在来重新建立索引,然后实现搜索提示。
建立索引并重新抽取数据
PUT /articles2
{
"mappings" : {
"doc" : {
"properties" : {
"content" : {
"type" : "text",
"fields" : {
"suggest" : {
"type" : "completion",
"analyzer": "ik_max_word"
},
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "long"
},
"title" : {
"type" : "text",
"fields" : {
"suggest" : {
"type" : "completion",
"analyzer": "ik_max_word"
},
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
一共有三个字段(id,title,content),其中title,content是需要实现搜索建议的字段,所以进行了相关分词器的配置:
结果为:
使用了基础的ik分词器,来尝试一下效果。
尝试查询
发现在对中文进行建议时,往往结果为空。
经过分析,感觉时ik分词器不能正确处理中文的原因。通过查资料发现,有人说:
用好Completion
Sugester并不是一件容易的事,实际应用开发过程中,需要根据数据特性和业务需要,灵活搭配analyzer和mapping参数,反复调试才可能获得理想的补全效果。
使用pinyin分词器和ik分词器综合,进行尝试
之前了解到pinyin分词器可以进行相关的配置,然后实现不同的结果,现在来试一下
找到了以下的资料:
这两篇博客使用了ik分词和拼音分词的综合使用,我来尝试一下
(1)首先看下ik分词器和pinyin分词器的不同的效果
pinyin分词器
ik分词器
(2)参照博客,为自己的数据重新建立一个索引
博客中ik分词器和pinyin分词器,综合使用配置,实现了五种不同的分词效果
我模仿他的配置建立自己的索引:
还是id,title,content三个字段,其中title和content进行了重点的suggest的分词配置
PUT /articles5/
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"pinyin_analyzer": {
"tokenizer": "s-pinyin"
},
"first_py_letter_analyzer": {
"tokenizer": "first_py_letter"
},
"full_pinyin_letter_analyzer": {
"tokenizer": "full_pinyin_letter"
}
},
"tokenizer": {
"s-pinyin": {
"keep_joined_full_pinyin": "true",
"keep_first_letter": "true",
"keep_separate_first_letter": "false",
"lowercase": "true",
"type": "pinyin",
"limit_first_letter_length": "16",
"keep_original": "true",
"keep_full_pinyin": "true",
"keep_none_chinese_in_joined_full_pinyin": "true"
},
"first_py_letter": {
"type": "pinyin",
"keep_first_letter": true,
"keep_full_pinyin": false,
"keep_original": false,
"limit_first_letter_length": 16,
"lowercase": true,
"trim_whitespace": true,
"keep_none_chinese_in_first_letter": false,
"none_chinese_pinyin_tokenize": false,
"keep_none_chinese": true,
"keep_none_chinese_in_joined_full_pinyin": true
},
"full_pinyin_letter": {
"type": "pinyin",
"keep_separate_first_letter": false,
"keep_full_pinyin": false,
"keep_original": false,
"limit_first_letter_length": 16,
"lowercase": true,
"keep_first_letter": false,
"keep_none_chinese_in_first_letter": false,
"none_chinese_pinyin_tokenize": false,
"keep_none_chinese": true,
"keep_joined_full_pinyin": true,
"keep_none_chinese_in_joined_full_pinyin": true
}
}
}
}
},
"mappings": {
"doc": {
"properties": {
"id" : {
"type" : "long"
},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"s-pinyin": {
"type": "completion",
"analyzer": "pinyin_analyzer"
},
"keyword-pinyin": {
"type": "completion",
"analyzer": "full_pinyin_letter_analyzer"
},
"keyword-first-py": {
"type": "completion",
"analyzer": "first_py_letter_analyzer"
},
"ik-word":{
"type": "completion",
"analyzer": "ik_max_word"
},
"standard-word":{
"type": "completion",
"analyzer": "standard"
}
}
},
"title": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"s-pinyin": {
"type": "completion",
"analyzer": "pinyin_analyzer"
},
"keyword-pinyin": {
"type": "completion",
"analyzer": "full_pinyin_letter_analyzer"
},
"keyword-first-py": {
"type": "completion",
"analyzer": "first_py_letter_analyzer"
},
"ik-word":{
"type": "completion",
"analyzer": "ik_max_word"
},
"standard-word":{
"type": "completion",
"analyzer": "standard"
}
}
}
}
}
}
}
在建立索引,抽取数据之后,尝试着查询以下:
用不同的分词策略会有不同的返回,可以从中筛选出想要的结果,这样比只是用ik分词器得到的结果要好了不少
**总结
结果是有5个,使用时不能都使用,需要根据不同的情况使用
keyword_pinyin一般来说查询最齐全,用的是拼音的比对而不是单纯的文字
ik-word->s-pinyin->keyword_pinyin->keyword_first_py->standard-word
偏差越大的应当放在越后,用于补全等操作。
1. 全中文词汇 采用ik-word ik分词 和standard 查询。
2. 含有英文和中文的 采用 s-pinyin keyword_pinyin
3. 全英文的就使用拼音**