同福

使用Elasticsearch分析器实现中文分词查询的方法【20201110】

介绍

介绍

今天福哥给大家介绍一下Elasticsearch的分词查询的使用技巧,通过分词查询可以避免不是很匹配的文档出现在结果当中。

举例:如果查询“北京”一般情况下都是想查询关于“北京”这个地区的相关信息,但是如果没有进行分词之前,“北”和“京”会作为单独的查询匹配项和文档中的字段进行匹配,那查询出来的结果就可想而知了。

为了解决这个问题,我们可以告诉ES那些词是一个整体,不要给我们拆开来单独匹配。

搜索关键词分析

可以通过analyze查看搜索关键词的分析结果

POST /_analyze
{
  "text": "福哥"
}

结果是“福”和“哥”是分开的

{
  "tokens": [
    {
      "token": "福",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<IDEOGRAPHIC>",
      "position": 0
    },
    {
      "token": "哥",
      "start_offset": 1,
      "end_offset": 2,
      "type": "<IDEOGRAPHIC>",
      "position": 1
    }
  ]
}

中文分析器

中文分析器elasticsearch-analysis-ik是一个ES的插件,使用这个插件就可以设置分词词条,然后设置ES的索引的分析器为ik_max_word或者ik_smart,就可以实现分词匹配的效果了。

下载

github官方网址

https://github.com/medcl/elasticsearch-analysis-ik/releases

福哥的ES的版本是6.5.2,所以下载6.5.2版本的插件

分词插件的版本必须和ElasticSearch的版本一致

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.2/elasticsearch-analysis-ik-6.5.2.zip

安装

使用安装ES的插件

/tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-plugin install file:///packages/elasticsearch-analysis-ik-6.5.2.zip

测试

使用ik_max_word分析器拆分关键词

POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": "北京福哥"
}

使用ik_smart分析器拆分关键词

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "北京福哥"
}

配置

创建索引

如果要给现有的索引的字段设置分析器的话,需要重新建立索引的。因为索引字段的映射(mapping)是不能修改的,只能在重建索引的时候一次性的设置好。

使用下面的命令创建索引“tfse”,建立两个字段的映射,并指定它们的类型和分析器。

注意事项:

  • 根节点是“mappings”不是“mapping”

  • 根节点“mappings”下面的节点要和索引名称一样

PUT /tfse
{
  "mappings": {
    "tfse": {
      "properties": {
        "mTitle": {
          "type": "text",
          "analyzer": "ik_smart",
          "search_analyzer": "ik_smart"
        },
        "mContent": {
          "type": "text",
          "analyzer": "ik_smart",
          "search_analyzer": "ik_smart"
        }
      }
    }
  }
}

写入数据

接下来就可以向索引“tfse”写入数据了,这里就不再详述了,大家都会的。

查询测试

现在我们查询ES的新索引“tfse”会发现“北京”不会再被当成两个单独的词进行匹配了,这样查询出来的结果就会比较准确了。

分词库

词典

分词库的词典文件存放在 /tongfu.net/env/elasticsearch-6.5.2/config/analysis-ik 下面,默认会有一些现成的词典文件,基本满足了大部分的搜索分词需要。

词典文件以“dic”作为文件扩展名,每一行一个词条,词典文件最后面要有一个空行。

07dc8e593ab3a5ad.jpg

默认词典

这里福哥把默认的词典给大家介绍一下,不建议删除哦~~

默认词典介绍:

  • main,默认主词典

  • preposition,介词词典,例如:爱与喜欢之间的“与”

  • quantifier,单位词典,例如:一袋米的“袋”

  • stopword,停止词典

  • suffix,后缀词典,例如:北京市的“市”

  • surname,姓氏,例如:上官芙蓉的“上官”

删除默认词典

有时候我们的搜索环境很专业,不需要默认词典里面的词条,有的同学就把默认的“dic”文件全部删除了,结果发现索引坏了。。。

这里要注意一下:默认词典文件不能删除,但可以清空里面的内容。

IKAnalyzer.cfg.xml

在词典文件存放目录下面有个 IKAnalyzer.cfg.xml 文件,用来配置更多的词典文件。

c80ba848e475f96f.jpg

自定义词典

可以看到在 IKAnalyzer.cfg.xml 文件里面有个ext_dict节点,可以在里面写上自定义的词典文件路径(相对路径)。

示例:福哥在ext_dict节点里面设置了tfse.dic这个扩展词典文件,然后在tfse.dic词典文件里面放上自定义的词条,重启ES后自定义的词典里面设置的词条就会生效了。

e82f8c29ab222b3f.jpg36215dc58626e51e.jpg

重建索引

如果分词库的词条有变化,直接搜索可能会发现匹配不到的问题,这不是ES的问题。因为分词的分析工作是在建立文档索引的时候进行的,所以我们要想根据新的词条搜索到文档,就必须重新建立数据索引才行。

词条有变,索引重建!!!

总结

今天福哥带着大家学习了Elasticsearch搜索引擎的分析器的使用方法,通过分析器可以让我们的ES匹配文档的时候更加符号实际情况,而不会机械的对每个单字进行匹配了。

维护分词库是一个需要时间和经验的工作,需要根据搜索引擎里面索引的内容的领域和文字特征等等因素对我们的分词库的词条进行不断地调整,我们的搜索引擎才会越来越好用~~