ToB企服应用市场:ToB评测及商务社交产业平台

标题: es 笔记二之基础查询 [打印本页]

作者: 农妇山泉一亩田    时间: 2023-5-20 05:12
标题: es 笔记二之基础查询
本文首发于公众号:Hunter后端
原文链接:es笔记二之基础查询
这一篇笔记介绍 es 的基础查询。
基础查询包括很多,比如排序,类似数据库 limit 的操作,like 操作,与或非等,对于这些操作,我会在介绍他们的用法之后加上对应的数据库 sql 便于理解。
注意: 下面的操作都在 kibana 中实现
以下是本篇文章目录:
1、全量查询

如果是想要查看 es 中都有哪些 index,可以如下操作:
  1. GET /_cat/indices
复制代码
然后可以看到在右侧会输出所有的 index,其中就包含我们上一篇笔记导入的 bank 数据,接下来我们使用 bank 作为查询示例。
如果我们想查看 bank 中的全部数据,可以如下操作,但是不指定 size 参数的话默认最多只返回 10 条数据:
  1. GET /bank/_search
复制代码
出来的结果大致如下:
  1. {
  2.   "took" : 2,
  3.   "timed_out" : false,
  4.   "_shards" : {
  5.     "total" : 1,
  6.     "successful" : 1,
  7.     "skipped" : 0,
  8.     "failed" : 0
  9.   },
  10.   "hits" : {
  11.     "total" : {
  12.       "value" : 1000,
  13.       "relation" : "eq"
  14.     },
  15.     "max_score" : 1.0,
  16.     "hits" : [
  17.       {
  18.         "_index" : "bank",
  19.         "_type" : "_doc",
  20.         "_id" : "1",
  21.         "_score" : 1.0,
  22.         "_source" : {
  23.           "account_number" : 1,
  24.           "balance" : 39225,
  25.           "firstname" : "Amber",
  26.           "lastname" : "Duke",
  27.           "age" : 32,
  28.           "gender" : "M",
  29.           "address" : "880 Holmes Lane",
  30.           "employer" : "Pyrami",
  31.           "email" : "amberduke@pyrami.com",
  32.           "city" : "Brogan",
  33.           "state" : "IL"
  34.         }
  35.       },
  36.       ...
  37.     ]
  38.   }
  39. }
复制代码
took 表示查询花费了多少时间,以毫秒为单位
time_out 表示查询是否超时
_shards 表示分片的查询信息,表示有多少个分片被查询,失败,和跳过
然后查询的结果都被放在 hits 字段下,在 hits 信息中,
hits.total 表示查询到了多少匹配的数据
hits.hits 是一个数组,包含了返回信息的全部内容,每个元素都是单个查询的返回结果。
在每个元素中,_index,_type,_id,_score 表示单条数据的所属的数据库信息
_source 其中包含了获取信息的字段信息,如果没有指定字段,则返回该数据所有字段。
2、返回数据排序

查询出的数据如果想要以某种顺序返回,可以使用 sort 来排序
比如说根据 balance 倒序排序
  1. GET /bank/_search
  2. {
  3.   "sort": [
  4.     {"balance": {"order": "desc"}}
  5.   ]
  6. }
复制代码
这条数据对应于 sql 中的语法就是:
  1. order by balance desc
复制代码
sort 后接一个数组,表示可以根据多个字段进行正序,逆序的排序方式。
3、限制返回条数

在前面的搜索中可以看出,如果不限定返回条数,系统会默认返回 10 条数据,在 es 中有类似于 MySQL 的 limit 和 offset 的操作,那就是 size 和 from。
from 表示从第 n 个开始获取数据,从 0 开始取值
size 表示获取数据量的大小。
比如说从第0条数据开始,获取5条数据,可以如下操作:
  1. GET /bank/_search
  2. {
  3.   "sort": [
  4.     {"balance": {"order": "asc"}}
  5.   ],
  6.   "from": 0,
  7.   "size": 5
  8. }
复制代码
对应于 sql 语法是:
  1. limit 5 offset 0;
复制代码
4、指定字段搜索

关于字段搜索,有几个关键字,match,match_phrase等。
match 表示模糊搜索,会将搜索的内容先进行分词操作,然后搜索,比如我们搜索 bank 这个 index 中 address 字段中包含 "cove" 或者 包含 "lane" 的的数据,我们可以如下操作:
  1. GET /bank/_search
  2. {
  3.   "query": {
  4.     "match": {"address": "Cove Lane"}
  5.   }
  6. }
复制代码
这条语句类似于 sql 中的:
  1. where address like "%cove%" or address like "%lane%"
复制代码
只要 address 的字符包含 cove 或者 lane 之一即可。
而如果我们想要实现 cove lane 作为一个整体进行查询,我们可以使用 match_phrase 来实现:
  1. GET /bank/_search
  2. {
  3.   "query": {
  4.     "match_phrase": {"address": "Cove Lane"}
  5.   }
  6. }
复制代码
这个操作类似于 sql 中的:
  1. where address like "%mill lane%"
复制代码
上面这些 match 操作都是大小写不敏感的。
关于 match 和 match_phrase 的筛选方式这里只做一个示例,在后面我会单开一篇笔记详细介绍其用法,针对 text 类型和 keyword 类型的字段。
5、多条件查询

多条件,就是与或非连接操作,类似于 sql 中的 and、or、not,对应在 es 中就是 must,should,must_not
在 es 中,每个连接操作都是一个数组,用于连接多个条件操作,示例如下:
  1. GET /bank/_search
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "should": [
  6.         {"match": {"age": 24}},
  7.         {"match": {"age": 25}}
  8.       ],
  9.       "must_not": [
  10.         {"match": {"gender": "M"}}
  11.       ]
  12.     }
  13.   }
  14. }
复制代码
可以看到,与或非的操作我们是在 query 的 bool 这个 key 的下一级,这个查询对应的 sql 的查询是:
  1. where (age = 24 or age = 25) and gender != "M";
复制代码
6、大小于过滤

在 es 中,大小于的过滤操作是复杂一点的,也在 bool 这个 key 下一级,用到 filter 和 range 关键字
大小于的关键字和 Django 里的是一样的用到 gt, gte, lt, lte 这几个
比如我们要搜索 age 的范围在 21 到 23 之间的包括 21 和 23  的数据
  1. GET /bank/_search
  2. {
  3.   "query": {
  4.     "bool":{
  5.       "filter": {
  6.         "range": {
  7.           "age": {
  8.             "gte": 21,
  9.             "lte": 22
  10.           }
  11.         }
  12.       }
  13.     }
  14.   }
  15. }
复制代码
上面的操作可以和与或非的操作进行并列,如果是直接搜索大小于的操作,可以直接如下操作:
  1. GET /bank/_search
  2. {
  3.   "query": {
  4.     "range": {
  5.       "age": {
  6.         "gte": 10,
  7.         "lte": 20
  8.       }
  9.     }
  10.   }
  11. }
复制代码
如果想获取更多后端相关文章,可扫码关注阅读:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4