【原创】Elasticsearch中文、拼音、组合分词搜索

1,871 阅读4分钟

一、中文分词器安装

1.es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体(如果单个字匹配,计算匹配度,不需要分词)

如图:

image.png

内置分词器默认为:standard,单词会被拆分,大小会转换为小写,每个中文字都会被拆分为独立的个体。

2.安装合适中文分词器插件

image.png

IKAnalyzer: 免费开源的java分词器,目前比较流行的中文分词器之一,简单,稳定,学习成本低,想要特别好的效果,需要自行维护词库,支持自定义词典。

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

作者:medcl。elastic项目组成员,Elastic中文社区维护者。

  • Linux安装:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
查看插件列表:sudo {ES_HOME}/bin/elasticsearch-plugin list
移除插件:sudo {ES_HOME}/bin/elasticsearch-plugin remove [pluginname]
注意:替换6.3.0为es版本号

image.png

  • Windows安装:

a.es文件夹插件文件新建ik文件夹。

image.png

b.对应版本下载对应的window包

image.png

c.解压到ik文件。将elascticsearch和kibana服务重启。

image.png

校验安装是否成功:

在Dev Tools中的Console界面的左侧输入命令,再点击绿色的执行按钮执行。

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "上海自来水来自海上"
}

安装前:

image.png

安装后:

image.png

看到这样的分词表示安装成功。

重点:ik的两种分词方式

ik_max_word:将文本做最细粒度的拆分。比如:上海自来水来自海上,拆分为:上海、自来水、自来、水、来自、海上。

ik_smart:最粗粒度的拆分。比如:上海自来水来自海上,拆分为:上海、自来水、来自、海上。

  • 测试:其他中文歧义识别都正常

比如: 这个人/手上/有痣、

我们公司/人手/不足

乒乓球拍/卖/完了、乒乓球/拍卖/完了

原则:分词按最小粒度分,搜索按最大粒度分。

对应mapping配置:

'name'=>['type'=>'text',"index"=>true,"analyzer"=>'ik_max_word','search_analyzer'=>'ik_smart']

3.自定义字典配置

新增文本词典:

目录:D:\elasticsearch-6.8.6\plugins\ik\config

编辑 IKAnalyzer.cfg.xml文件 引入

image.png

custom/ext.dic多个文件用;隔开

新增文件:custom/ext.dic 添加词条。定义:盆底 盆底肌。需要重启es,若词条或者搜索不生效需要reindex。

image.png

定义之前:

image.png

定义之后:

image.png

调用es分词接口:

image.png

使用ik_max_word分词

image.png

Linux自定义词典与window类似。

  • 记一次重启es的坑:
find / -name elasticsearch 查找es相关安装信息。
es安装目录:/usr/share/elasticsearch。
测试安装好插件(pinyin)之后。
重启es:sudo /etc/init.d/elasticsearch restart
老是field。
通过:sudo /etc/init.d/elasticsearch status查询

报错 could not find java; set JAVA_HOME or ensure java is in PATH
java -version 显示版本 环境变量没问题
vim /ect/profile 查看java环境变量 /usr/local/java

查看es配置/etc/sysconfig/elasticsearch
发现# Elasticsearch Java path配置为空
引入java_home环境变量路径

sudo /etc/init.d/elasticsearch restart
running
  • 记一次分词配置的坑:
路径与window不一致,通过命令安装,导致手动创建引入无效。
查找es运行日志文件:find / -name elasticsearch.log
日志文件路径:/var/log/elasticsearch/elasticsearch.log

通过看运行日志找到配置路径
/etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 巨坑
测试分词配置路径 /etc/elasticsearch/analysis-ik
自定义分词:custom/ext.dic
sudo /etc/init.d/elasticsearch restart
success

两次总结:根据日志排查问题,避免无从下手。

image.png

  • 热更新添加分词:

image.png

二、拼音分词器安装

github:https://github.com/medcl/elasticsearch-analysis-pinyin

window与Linux安装一致。 下载对应es版本的分词器。 在扩展文件夹plugins新增pinyin文件。把下载的文件解压到该文件里。 重启es。

安装成功:

image.png

对应mapping配置

'question_name' => ['type'=>'text', 'index' => true, "analyzer"=>'pinyin', 'search_analyzer'=>'pinyin']

对应分词器配置说明

image.png

三、ik+pinyin组合分词实现

es可以自定义分词器。(文档)github.com/elasticsear…

前提:已经安装ik+pinyin分词器。

配置:(重点)自定义mapping和自定义分词器

image.png

理解:ik分词 然后将分词后的逐项结果通过filter交给拼音分词 。比如你好测试,ik会分成 你好、测试。然后你好交给pinyin会分词 ni,hao,nh,n,h  测试会分词 ce,shi,cs,c,s。

image.png

mapping中直接使用自定义的分词器。

image.png

'question_name' => ['type'=>'text', 'index' => true, "analyzer"=>'ik_pinyin_analyzer', 'search_analyzer'=>'ik_pingying_smark']

配置完成!

四、操作流程

1.执行脚本创建索引

image.png

2.数据同步到es

image.png

3.查询

image.png

4.高亮配置

image.png

5.结果

image.png

全拼音

image.png

拼音+汉字

image.png

拼音首字母

image.png

写在最后:这些对于es来说只是的海边的一个贝壳,还有大海等待我们去探索。

image.png

数据来源:个人博客