写点什么

Elasticsearch 中的 Term 查询和全文查询

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:2125 字

    阅读完需:约 7 分钟

{"index":{"_index":"index_002"}}


{"id":"5","name":"wolf","address":null,"count":1}


Term 查询




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


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


POST index_001/_search


{


"query": {


"term": {


"name.keyword": {


"value": "lonely wolf"


}


}


}


}


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


POST /_analyze


{


"analyzer": "standard",


"text": ["lonely wolf"]


}



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


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

exists 查询

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


GET index_002/_search


{


"query": {


"exists": {


"field": "address"


}


}


}


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


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


GET index_002/_search


{


"query": {


"bool": {


"must_not": [


{


"exists": {"field": "address"}


}


]


}


}


}

fuzzy 查询

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



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


  • 修改一个单词,如:box—>fox

  • 移除一个单词,如:black–>lack

  • 插入一个单词,如:sic–>sick

  • 转换两个单词顺序,如:act–>cat


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


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


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


lonelyyloneyle 都能查询出前面四条数据:


GET index_002/_search


{


"query": {


"fuzzy": {


"name": {


"value": "lonel"


}


}


}


}

ids 查询

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


GET index_002/_search


{


"query": {


"ids": {


"values": ["id1","id2"]


}


}


}

prefix 查询

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


GET index_002/_search


{


"query": {


"prefix": {


"name": {


"value": "lo"


}


}


}


}

range 查询

通过范围进行查询。


GET index_002/_search


{


"query": {


"range": {


"id": {


"gte": 1,


"lte": 2


}


}


}


}


其中:


  • gt:表示大于。

  • gte:表示大于等于。

  • lt:表示小于。

  • lte:表示小于等于。


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


GET _search


{


"query": {


"range" : {


"timestamp" : {


"gte" : "now-1d/d",


"lt" : "now/d"


}


}


}


}

regexp 查询

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


GET index_002/_search


{


"query": {


"regexp": {


"name": "lon.*"


}


}


}

term 查询

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

返回前面四条数据

GET index_002/_search


{


"query": {


"term": {


"name": {


"value": "lonely"


}


}


}


}

只返回第一条数据

GET index_002/_search


{


"query": {


"term": {


"name.keyword": {


"value": "lonely wolf"


}


}


}


}

terms 查询

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

返回全部五条数据

GET index_002/_search


{


"query": {


"terms": {


"name": [


"lonely",


"wolf"


]


}


}


}

terms_set 查询

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

这里只能查询第一和第三两条数据,因为 Wolf 中的首字母大写,无法被精确匹配上,count 列不能是 text 类型

GET index_002/_search


{


"query": {


"terms_set": {


"name": {


"terms": [


"lonely",


"Wolf"


],


"minimum_should_match_field": "count"


}


}


}


}

type 查询

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

wildcard 查询

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


GET index_002/_search


{


"query": {


"wildcard": {


"name": {


"value": "lone*"


}


}


}


}


全文查询




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


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

match 查询

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

返回全部 5 条数据

POST index_002/_search


{


"query": {


"match": {


"name": "lonely wolf"

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Elasticsearch中的Term查询和全文查询