创新实训(46)——基于ElasticSearch的Completion Suggest实现搜索提示

前言

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

建立索引并重新抽取数据

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分词器可以进行相关的配置,然后实现不同的结果,现在来试一下
找到了以下的资料:

https://blog.csdn.net/baifanwudi/article/details/88662561
https://blog.csdn.net/TerryLam2010/article/details/105972057

这两篇博客使用了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. 全英文的就使用拼音
**

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值