elasticsearch中term与match

分词器、字符串类型、倒排索引

在说term和match之前,需要先了解一下这三个概念

分词器

es默认的分词器是standard analyzer,该分词器的特点是:将所有英文字符串的大写字母转换成小写字母,然后按照空格对英文字符串进行分词,如果遇到汉字,则将汉字一个字作为一个分词。可以看出,该分词器对于中文句子的分词效果来说并不好,无法以合适的中文词组来分词。
为了提高中文的分词效果,可以增加ik分词器插件,该插件提供了两种好用的分词策略:最少切分ik_smart analyzer和最细粒度切分ik_max_word analyzer,前者的每个分词都没有重复切分的字,后者则可以有重复切分,后者的分词集合通常来说会比前者大。
keyword analyzer是专门为keyword类型的字符串准备的分词器,该分词器的特点是:不会对字符串进行切分,即分词集合只包含一个字符串。

字符串类型

es比较常用的字符串类型是textkeyword,默认是text。
text可以被分词器分词(默认使用分词器standard analyzer,也可以指定别的分词器),keyword不可以被分词(使用了分词器keyword analyzer)

倒排索引

当向es中添加一个文档时,文档中可被分词的字段(除了keyword类型之外的字段)会被分词器(默认使用分词器standard analyzer,也可以指定别的分词器)进行分词,形成一个分词集合存储在倒排索引中。也就是说,对于可分词的字段,es中存储的并不是一串完整的字符串,而是该字符串的一个一个的分词。

精确匹配term

term的查询参数不会被分词器分词,es会将完整的查询参数与倒排索引中对应字段的分词集合进行对比查询。
term查询中文句子的效果比较差,不建议在这种场景下使用term

模糊匹配match

match的查询参数(keyword类型除外)会被分词器分词,使用的分词器是所查询字段在mappings中指定的分词器,默认为standard analyzer。查询参数被分词后产生的分词集合与倒排索引中相应字段的分词集合进行对比查找,只要有一个分词匹配成功,该文档就会被纳入检索结果返回。

es查询的基本流程

1.mappings指定字段类型和分词器
2.新增文档
3.es对新增文档中的字段(keyword类型的字段除外)使用mappings中相应字段指定的分词器(默认为standard analyzer)来进行分词,将分词结果存入倒排索引中;keyword类型的字段直接存储整个字段内容
4.搜索文档
5.搜索参数字段类型是否为keyword
6.是,则不管term还是match搜索,搜索参数都不会被分词,搜索参数字段整个内容形成只包含一个内容的分词集合
7.否,则当使用term搜索时,搜索参数不会被分词;当使用match搜索时,搜索参数会被mappings中相应字段指定的分词器(默认为standard analyzer)分词,形成分词集合
8.将搜索的分词集合与es中相应字段的倒排索引进行匹配搜索,es每一个文档中只要有一个分词与分词集合的任一分词匹配,则将此文档放入搜索结果中返回

term和match的区别

两者最大的区别就是:当搜索参数为text类型的字段时,有没有对搜索参数进行分词操作!term没有,而match有。

例子

创建一个索引testes并构建mappings,定义三个字段:title(类型:text,分词器:standard analyzer),content(类型:text,分词器:ik_max_word analyzer),desc(类型:keyword)
elasticsearch中term与match_第1张图片
新增两个文档
elasticsearch中term与match_第2张图片
对title进行分词

第一个文档
title分词1
结果
elasticsearch中term与match_第3张图片

第二个文档

title分词2

结果
elasticsearch中term与match_第4张图片

对content进行分词

第一个文档
content分词2
结果
elasticsearch中term与match_第5张图片

第二个文档
content分词2
结果
elasticsearch中term与match_第6张图片
term搜索

title搜索“今天”
elasticsearch中term与match_第7张图片
结果
elasticsearch中term与match_第8张图片
title搜索“吃”
elasticsearch中term与match_第9张图片
结果
elasticsearch中term与match_第10张图片
content搜索“面条”
elasticsearch中term与match_第11张图片
结果
elasticsearch中term与match_第12张图片
content搜索“吃”
elasticsearch中term与match_第13张图片
结果
elasticsearch中term与match_第14张图片
desc搜索“好吃”
elasticsearch中term与match_第15张图片
结果
elasticsearch中term与match_第16张图片
desc搜索“面很好吃”
elasticsearch中term与match_第17张图片

结果
elasticsearch中term与match_第18张图片
match搜索

title搜索“明天”

对“明天”进行分词
“明天”分词
“明天”分词结果
elasticsearch中term与match_第19张图片
搜索
elasticsearch中term与match_第20张图片
结果
elasticsearch中term与match_第21张图片
content搜索“吃”
elasticsearch中term与match_第22张图片
结果
elasticsearch中term与match_第23张图片

content搜索“牛肉”

对“牛肉”进行分词
对“牛肉”进行分词

“牛肉”分词结果
elasticsearch中term与match_第24张图片

搜索
elasticsearch中term与match_第25张图片

结果

elasticsearch中term与match_第26张图片
desc搜索“好吃”
elasticsearch中term与match_第27张图片

结果
elasticsearch中term与match_第28张图片
desc搜索“肉最好吃了”
elasticsearch中term与match_第29张图片

结果
elasticsearch中term与match_第30张图片
参考博客
Elasticsearch 入门教程 – term 查询和match 查询(text和keyword)
Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用

你可能感兴趣的:(elasticsearch,elasticsearch,term,match)