1.analysis 和 analyzer
analysis是指把全文本转换成一系列单词(term/token)的过程,也叫分词。
analysis是通过分词器analyzer来实现的
2.分词
String类型的数据在es中有两种类型:
keyword:
对于存储的数据不会进行分词,需要全文匹配才能,比方数据库存入"我爱中国",那么必须要搜索"我爱中国"才能匹配到该条数据
text:
会分词,先把对象进行分词处理,然后再再存入到es中。比方数据库存入"我爱中国",那么在数据库存入之前会分词可能为"我","爱","中国",那么通过分词后的三个词条都可以匹配到该条数据
ES 内置了许多分词器:
Standard Analyzer - 默认分词器,按词切分,小写处理
Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
Stop Analyzer - 小写处理,停用词过滤(the ,a,is)
Whitespace Analyzer - 按照空格切分,不转小写
Keyword Analyzer - 不分词,直接将输入当做输出
Pattern Analyzer - 正则表达式,默认 \W+
Language - 提供了 30 多种常见语言的分词器
ik_max_word和 ik_smart介绍
IK分词器有两种分词模式:ik_max_word和ik_smart模式。
1、ik_max_word
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
2、ik_smart
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
测试两种分词模式的效果:
发:post localhost:9200/_analyze
测试ik_max_word
{“text”:“中华人民共和国人民大会堂”,“analyzer”:“ik_max_word” }
测试ik_smart
{“text”:“中华人民共和国人民大会堂”,“analyzer”:“ik_smart” }
对于一些特定的情况,es内置的分词器无法完全符合我们业务的时候我们可以自己去创建分词器,并且制定分词规则,代码如下:
//设置分词器,一定需要在没有所有的时候设置
XContentBuilder settingsBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("analysis")
.startObject("analyzer")
.startObject("comma_analyzer")
.field("type", "pattern")
.field("pattern", ",") //将分词器规则定义为按照","进行分词
.endObject()
.endObject()
.endObject()
.endObject();
//创建索引并且添加配置信息
CreateIndexResponse indexResponse = client
.admin()
.indices()
.prepareCreate(indexName)
.setSettings(settingsBuilder)
.get();