前言

现在来重新建立索引,然后实现搜索提示。

建立索引并重新抽取数据

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是需要实现搜索建议的字段,所以进行了相关分词器的配置:

es搜索模糊搜索 es搜索提示_项目实训


结果为:

es搜索模糊搜索 es搜索提示_分词器_02


使用了基础的ik分词器,来尝试一下效果。

尝试查询

es搜索模糊搜索 es搜索提示_数据_03


es搜索模糊搜索 es搜索提示_项目实训_04


es搜索模糊搜索 es搜索提示_分词器_05


发现在对中文进行建议时,往往结果为空。

经过分析,感觉时ik分词器不能正确处理中文的原因。通过查资料发现,有人说:

用好Completion
Sugester并不是一件容易的事,实际应用开发过程中,需要根据数据特性和业务需要,灵活搭配analyzer和mapping参数,反复调试才可能获得理想的补全效果。

使用pinyin分词器和ik分词器综合,进行尝试

之前了解到pinyin分词器可以进行相关的配置,然后实现不同的结果,现在来试一下
找到了以下的资料:

这两篇博客使用了ik分词和拼音分词的综合使用,我来尝试一下

(1)首先看下ik分词器和pinyin分词器的不同的效果

pinyin分词器

es搜索模糊搜索 es搜索提示_项目实训_06


ik分词器

es搜索模糊搜索 es搜索提示_es搜索模糊搜索_07


(2)参照博客,为自己的数据重新建立一个索引

博客中ik分词器和pinyin分词器,综合使用配置,实现了五种不同的分词效果

es搜索模糊搜索 es搜索提示_项目实训_08


我模仿他的配置建立自己的索引:

还是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"
                    }
             
           

          }
        }
      }
    }
  }
}

在建立索引,抽取数据之后,尝试着查询以下:

es搜索模糊搜索 es搜索提示_es搜索模糊搜索_09


es搜索模糊搜索 es搜索提示_analyzer_10


用不同的分词策略会有不同的返回,可以从中筛选出想要的结果,这样比只是用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. 全英文的就使用拼音
**