点击这里给我发消息 QQ登录
【原创】 Elasticsearch中文+拼音+组合分词搜索
栏目:elasticsearch  作者:力涛  阅读:(4287)

一、中文分词器安装

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文件。将elascticsearchkibana服务重启。

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查询

image.png

报错 could not find java; set JAVA_HOME or ensure java is in PATH

java -version 显示版本 环境变量没问题

vim /ect/profile 查看java环境变量 /usr/local/java

image.png

查看es配置/etc/sysconfig/elasticsearch

发现# Elasticsearch Java path配置为空

引入java_home环境变量路径

image.png

sudo /etc/init.d/elasticsearch restart

running

记一次分词配置的坑:

路径与window不一致,通过命令安装,导致手动创建引入无效。

查找es运行日志文件:find / -name elasticsearch.log

日志文件路径:/var/log/elasticsearch/elasticsearch.log

image.png

通过看运行日志找到配置路径

/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']

对应分词器配置说明

0

三、ik+pinyin组合分词实现

es可以自定义分词器。(文档)https://github.com/elasticsearch-cn/elasticsearch-definitive-guide

前提:已经安装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

拼音首字母

image.png

image.png

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



下一篇: 没有了


昵称
邮箱
域名
  记住 通知博主
验证码