学学Elasticsearch:Term查询和全文查询,一文详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学学Elasticsearch:Term查询和全文查询,一文详解相关的知识,希望对你有一定的参考价值。

参考技术A 在 Elasticsearch 中,Term 查询和全文查询是两种完全不同的处理方式,那么本文就彻底地来理清这两种查询之间的关系。

我们重新创建一个新的索引 index_002,并插入以下数据

Term 查询一般表达的是最小单位查询,也就是说对我们传入的关键字会作为一个整体进行查询,而不会进行分词。

如下查询,满足条件的只有第一条数据,需要注意的是对 text 类型字段需要加上 .keyword:

这里如果不加上 .keyword 则不会返回任何结果,这是因为 text 类型的字段会被倒排索引进行存储,倒排索引会利用分析器将文本进行分词,我们可以利用分词器来查看下分词结果:

可以看到,lonely wolf 被分成了 lonely 和 wolf 两个单词,所以我们将 lonely wolf 作为一个进行查询自然是无法查询到结果的。

这里有个地方需要注意,如果我们存入的是大写单词,如 Lonely Wolf,分词器也是一样的结果,也就是会将大写字母统一转化为小写进行存储,所以进行全文查询的时候也是无法查询出结果。

用来判定是否存在某一个字段,返回包含字段的任何索引值的文档。

这里返回的结果就是第三条和第四条数据,像 null 值和空数组 [] 不会被返回。

如果想要返回 null 值或者空数组 [] 的数据,那么可以利用 bool 查询的 must_not 语句:

用于近似查询,比如我们有时候在用百度搜索的时候,输错了字会被纠正:

一般情况下有一个单词错误的情况下,fuzzy 查询可以找到另一个近似的词来代替,主要有以下场景:

为了可以查询到这种近似的单词,fuzzy 查询需要创建一个所有近似词的集合,这样搜索的时候就可以采用精确查询找到近似的词来代替查询。

比如下面这个查询就可以查询出前面四条数据,同样的,value 修改为 loneyl 或 lonelyy 或 loneyle 都能查询出前面四条数据:

通过文档 id 进行查询返回,这里的 id 为文档中的 _id。

通过指定字段的前缀进行查询。

通过范围进行查询。

其中:

这种范围查询还可以用于日期的范围查询,此时将会对日期进行毫秒数转换后进行查询,如下面的例子就是查询昨天到今天的区间,而且可以通过 time_zone 指定时区:

通过正则表达式进行查询。如下例子可以查询出 lon 开头的所有数据:

返回一个或者多个单词精确匹配的文档。

terms 查询和 term 查询是一个含义,区别只是 terms 可以一次精确匹配多个词。

terms_set 查询和 terms 查询是一样的查询规则,不同的是 terms_set 查询可以定义匹配词项的数量,定义的数量只能从文档中的某一列中进行获取或者使用脚本进行配置:

指定类型查询,type 类型在 7.0 版本已经标注为过期,8.0 版本已经被废弃。

通过通配符进行查询,这个可以理解为是简易版本的正则表达式查询:

高级全文查询通常用于对全文字段 text 类型(比如电子邮件的正文)进行全文查询。全文查询在搜索和索引时,都会对字段进行分词处理,查询之前会先对输入的词进行分词处理,然后对每个词项进行查询,最后将结果进行合并,并根据算分结果将结果进行返回。

全文查询也包括很多种,在这里我们主要介绍 match 查询和 match_phrase 查询。

match 查询是执行全文搜索的标准查询,包括模糊匹配选项。如下就是一个标准的 match 查询语句:

对比 term 查询:

根据上面几个查询的结果我们可以得出 term 查询和全文 match 查询的区别:

根据这两个结论,也可以很明显知道,一般不对 text 类型字段采用 term 查询,因为 text 类型字段会被分词索引,可能会导致无法被 term 查询匹配出结果。

再看下面这个例子,会返回第二和第三两条数据(分词后的搜索和顺序无关):

match_phrase 会将输入的搜索关键字作为一个短语进行查询,这点看来类似于 term 查询,但是 match_phrase 查询内嵌了一个参数 slot 用来定义短语中允许的空隙,默认是 0 表示中间不允许有其他词:

这条语句的结果就能查询出第一和第四条数据,注意,虽然第四条数据中的 lonely wolf 是大写字母开头,但是索引的时候会将其转为小写进行索引,所以也能查询出结果。

此时我们加入 slot=1 条件进行查询,表示允许短语之间存在一个间隙,所以此时能查询出第二条数据:

本文主要讲述了 Term 查询和全文查询中 match 查询的区别,总结起来主要有以下几点:

以上是关于学学Elasticsearch:Term查询和全文查询,一文详解的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch中的Term查询和全文查询

elasticsearch怎么根据term和range查询

ElasticSearch基础3:全文搜索

elasticsearch term 查询

ElasticSearch结构化搜索和全文搜索

关于全文搜索elasticsearch中matchQuery和termQuery的区别