首先我们通过dev_tools发送GET请求查询分词效果

  1. GET /_analyze
  2. {
  3. "text":"农业银行"
  4. }

得到如下结果,可以发现es的默认分词器无法识别中文中农业银行这样的词汇,而是简单的将每个字拆完分为一个词,这显然不符合我们的使用要求。
image.png
首先我们访问 https://github.com/medcl/elasticsearch-analysis-ik/releases 下载与es对应版本的中文分词器。将解压后的后的文件夹放入es根目录下的plugins目录下,重启es即可使用。【注意分词器插件版本需和es版本对应】
我们这次加入新的参数“analyzer”:”ik_max_word”

  • ik_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合
  • ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」
    GET /_analyze
    {
    "analyzer":"ik_max_word",
      "text":"农业银行"
    }
    
    得到如下结果:
    image.png
    百度搜索中每天都会收录新的词汇,es中也可以进行扩展词汇。
    我们首先查询 弗雷尔卓德
    image.png
    仅仅可以得到每个字的分词结果,我们需要做的就是使分词器识别到 弗雷尔卓德 也是一个词语。

首先进入es根目录中的plugins文件夹下的ik文件夹,进入 config 目录,创建 custom.dic 文件,写入 弗雷尔卓德 。同时打开 IKAnalyzer.cfg.xml 文件,将新建的 custom.dic 配置其中,重启es。(注:一行输入一个词)

弗雷尔卓德
弗雷尔
弗
雷
尔
卓
德
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">custom.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

再次查询发现es的分词器可以识别到 弗雷尔卓德 词汇
image.png

分词器最佳实践

因为后续的keyword和text设计分词问题,这里给出分词最佳实践。即索引时用ik_max_word,搜索时分词器用ik_smart,这样索引时最大化的将内容分词,搜索时更精确的搜索到想要的结果。
例如我想搜索的是小米手机,我此时的想法是想搜索出小米手机的商品,而不是小米音响、小米洗衣机等其他产品,也就是说商品信息中必须只有小米手机这个词。
我们后续会使用”search_analyzer”: “ik_smart”来实现这样的需求。

中文停用词设置

在使用 elasticsearch 进行搜索的时候,经常会发现一篇和搜索关键字完全不匹配的文章排在最前面。它可能就被 ik_max_word 分词后,刚好就有类似 “的” 这样的无意义词,导致造成一篇含有很多无意义词的文章得到一个较高的评分。
那么一个有效的解决办法就是对这些无意义的词——停用词进行屏蔽。

解决方案

如果你使用 ik 中文分词器,它默认设置的停用词都是英文的,比如 AND、OR 等。
配置文件在 elasticsearch-7.x.x\plugins\ik\config\ 目录下,打开目录可以看到有 stopword.dic 和 extra_stopword.dic 两个文件。stopword.dic 里面的为配置的英文停用词,extra_stopword.dic 里面为配置的中文停用词。
默认是使用 stopword.dic 的,想要使用 extra_stopword.dic 的话是需要在 ik 中进行配置的,配置文件为 IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict"></entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">extra_stopword.dic</entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

配置完成后重启 elasticsearch,就可以发现停用词已经不再对搜索产生影响了。