原创

Elasticsearch实践(四):IK分词

IK分词
IK支持两种分词模式:

ik_max_word: 会将文本做最细粒度的拆分,会穷尽各种可能的组合
ik_smart: 会做最粗粒度的拆分
ES内置的Analyzer分析器
es自带了许多内置的Analyzer分析器,无需配置就可以直接在index中使用:

标准分词器(standard):以单词边界切分字符串为terms,根据Unicode文本分割算法。它会移除大部分的标点符号,小写分词后的term,支持停用词。
简单分词器(simple):该分词器会在遇到非字母时切分字符串,小写所有的term。
空格分词器(whitespace):遇到空格字符时切分字符串,
停用词分词器(stop):类似简单分词器,同时支持移除停用词。
关键词分词器(keyword):无操作分词器,会输出与输入相同的内容作为一个single term。
模式分词器(pattern):使用正则表达式讲字符串且分为terms。支持小写字母和停用词。
语言分词器(language):支持许多基于特定语言的分词器,比如english或french。
签名分词器(fingerprint):是一个专家分词器,会产生一个签名,可以用于去重检测。
自定义分词器:如果内置分词器无法满足你的需求,可以自定义custom分词器,根据不同的character filters,tokenizer,token filters的组合 。例如IK就是自定义分词器。
  https://www.cnblogs.com/52fhy/p/10046823.html

  https://www.cnblogs.com/xiaobaozi-95/p/9328948.html

解决Elasticsearch中文搜索只能搜索单个汉字,不能搜索词语的问题
2018年10月25日2018年10月26日 ~ xieshaohu

1 Vote
问题原因:ES默认分词规则不能支持中文,通过安装IK Analysis for Elasticsearch支持中文分词。

重要提示:不能再已经导入数据的index中修改mapping,所以建立index之后立即配置分词器字段,然后再导入数据。

首先从https://github.com/medcl/elasticsearch-analysis-ik/tree/master下载ES对应版本的IK插件进行安装,安装方法参考链接中的文档。
使用以下命令重新创建一个Index
curl -XPUT http://localhost:9200/cdh_es

设置需要使用IK分词器的字段,其中cdh_es是index,testdata是type,desc是需要进行IK分词的字段。
curl -XPOST http://localhost:9200/cdh_es/testdata/_mapping -d ‘{“properties”: {“desc”: {“type”: “text”, “analyzer”: “ik_smart”, “search_analyzer”: “ik_smart”}}}’

其中分词有两种设置方法,ik_max_word和ik_smart,他们的区别如下,可以根据自己项目的情况进行选择:
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

添加数据后就能进行查询了。
https://xieshaohu.wordpress.com/2018/10/25/%E8%A7%A3%E5%86%B3elasticsearch%E4%B8%AD%E6%96%87%E6%90%9C%E7%B4%A2%E5%8F%AA%E8%83%BD%E6%90%9C%E7%B4%A2%E5%8D%95%E4%B8%AA%E6%B1%89%E5%AD%97%EF%BC%8C%E4%B8%8D%E8%83%BD%E6%90%9C%E7%B4%A2%E8%AF%8D/

elasticsearch中TermQuery查不到数据问题

  在java rest client中调用elasticsearch中的数据,精准匹配的termQuery查不到数据,这个问题是java rest client客户端自带的bug,换用matchPhraseQuery直接替换即可。有点坑!

  在elastic权威指南一书中是这样给出建议的:"匹配查询 match 是个 核心 查询。无论需要查询什么字段, match 查询都应该会是首选的查询方式。它是一个高级 全文查询 ,这表示它既能处理全文字段,又能处理精确字段。"这就意味着match查询是高级查询,底层使用了term查询。

  结论:相关度查询使用match,精确字段查询使用matchPhrase即可。

可以试一下QueryBuilders.matchPhraseQuery("ES中想匹配的字段","值");

正文到此结束
该篇文章的评论功能已被站长关闭
本文目录