ES分词器种类
- 常见的分词器,如Standard分词器、Simple分词器、Whitespace分词器、IK分词等,还支持自定义分词器(比如一些小国家的语言需要自定义分词器)
- ES默认就是Standard分词器
分词器在分词时的过程
- 标记化:分词器第一步是将文本拆分成单个标记(tokens), 就是单个的单词或中文词组,这个标记可以是单词,数组,特殊字符,中文词语等。 此时会包含一些分隔符,标点,停用词等,并非最终形态的分词。
- 过滤:对第一步分出来的所有标记进行过滤操作,比如大小写转换,去除停用词,去掉分隔符标点等操作,形成最终形态的分词集
- 倒排索引:分词完成后,ES会创建倒排索引来存储这些分词, 倒排索引是一种数据结构,通过倒排索引,把分词和文档document(即原始文本)建立起映射关系,当搜索某个分词的时候,就会将映射到的文档进行返回。
- 查询匹配:查询时我们输入的文本内容,也会在ES进行分词处理,将搜索内容分词后,拿着分词去倒排索引中进行查询,把匹配到的分词对应的映射document进行返回。
Standard分词器的规则
- 标点符号切分:如果文本中含有标点符号,那么会根据标点符号进行拆分,比如apple,peach,food。那么拆分结果就是[apple 和 peach 和 food]这3个,会根据逗号拆分
- 词分割: 即按照空格进行拆分, 比如: my name is hbz, 拆分结果就是[my 和 name 和 is 和 hbz]这4个词拆成独立的分词
- 小写转换:即会将文本中的大小写全部转成小写, 比如Hellow World, 则拆分结果就是[hellow 和 world], 首字母的H,W都会转成小写的h, w
- 停用词过滤: 过滤掉无效的单词,比如a, an, the这种连接词,这些词本身没啥意义,做分词的时候Standard分词器会将这些排除
- 词干提取:将单词还原成原始形态, 比如 running–>run, swimming–>swid, going–>go, jumped–>jump
- ==注意:以上这5个特点是同时生效的,即一段文本会按照这5中规则进行分词,最终结果一定是符合这5中规则的。 ==
如何查看ES分词存储效果?
GET /索引名称/_analyze
GET /_index/_analyze
{
"analyzer": "分词器名称",
"field": "字段名称"
"text": "待分析的文本"
}
案例:
#字段是text类型
POST /my_index/_analyze
{
"field": "title",
"text": "This is some text to analyze"
}
#字段是text类型
POST /my_index/_analyze
{
"field": "title",
"text": "今天学习了编程知识"
}
#字段是keyword类型(keyword是精确匹配,所以不会进行分词,This is some text to analyze作为一个完整体)
POST /my_index/_analyze
{
"field": "tags",
"text": "This is some text to analyze"
}
#字段是keyword类型(这是数组的keyword,会将数组的每个元素进行分离出来,但每个元素不会再进行分词了,即结果就是This is, java, Spring Boot。大小写也不会转换,因为根本没走分词器)
POST /my_index/_analyze
{
"field": "tags",
"text": ["This is","java","Spring Boot" ]
}