关于后端:es-笔记二之基础查询

40次阅读

共计 2667 个字符,预计需要花费 7 分钟才能阅读完成。

本文首发于公众号:Hunter 后端
原文链接:es 笔记二之根底查问

这一篇笔记介绍 es 的根底查问。

根底查问包含很多,比方排序,相似数据库 limit 的操作,like 操作,与或非等,对于这些操作,我会在介绍他们的用法之后加上对应的数据库 sql 便于了解。

留神: 上面的操作都在 kibana 中实现

以下是本篇文章目录:

  1. 全量查问
  2. 返回数据排序
  3. 限度返回条数
  4. 指定字段搜寻
  5. 多条件查问
  6. 大小于过滤

1、全量查问

如果是想要查看 es 中都有哪些 index,能够如下操作:

GET /_cat/indices

而后能够看到在右侧会输入所有的 index,其中就蕴含咱们上一篇笔记导入的 bank 数据,接下来咱们应用 bank 作为查问示例。

如果咱们想查看 bank 中的全副数据,能够如下操作,然而不指定 size 参数的话默认最多只返回 10 条数据:

GET /bank/_search

进去的后果大抵如下:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1000,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "account_number" : 1,
          "balance" : 39225,
          "firstname" : "Amber",
          "lastname" : "Duke",
          "age" : 32,
          "gender" : "M",
          "address" : "880 Holmes Lane",
          "employer" : "Pyrami",
          "email" : "amberduke@pyrami.com",
          "city" : "Brogan",
          "state" : "IL"
        }
      },
      ...
    ]
  }
}

took 示意查问破费了多少工夫,以毫秒为单位

time_out 示意查问是否超时

_shards 示意分片的查问信息,示意有多少个分片被查问,失败,和跳过

而后查问的后果都被放在 hits 字段下,在 hits 信息中,

hits.total 示意查问到了多少匹配的数据

hits.hits 是一个数组,蕴含了返回信息的全部内容,每个元素都是单个查问的返回后果。

在每个元素中,_index,_type,_id,_score 示意单条数据的所属的数据库信息

_source 其中蕴含了获取信息的字段信息,如果没有指定字段,则返回该数据所有字段。

2、返回数据排序

查问出的数据如果想要以某种程序返回,能够应用 sort 来排序

比如说依据 balance 倒序排序

GET /bank/_search
{
  "sort": [{"balance": {"order": "desc"}}
  ]
}

这条数据对应于 sql 中的语法就是:

order by balance desc

sort 后接一个数组,示意能够依据多个字段进行正序,逆序的排序形式。

3、限度返回条数

在后面的搜寻中能够看出,如果不限定返回条数,零碎会默认返回 10 条数据,在 es 中有相似于 MySQL 的 limit 和 offset 的操作,那就是 size 和 from。

from 示意从第 n 个开始获取数据,从 0 开始取值

size 示意获取数据量的大小。

比如说从第 0 条数据开始,获取 5 条数据,能够如下操作:

GET /bank/_search
{
  "sort": [{"balance": {"order": "asc"}}
  ],
  "from": 0,
  "size": 5
}

对应于 sql 语法是:

limit 5 offset 0;

4、指定字段搜寻

对于字段搜寻,有几个关键字,match,match_phrase 等。

match 示意含糊搜寻,会将搜寻的内容先进行分词操作,而后搜寻,比方咱们搜寻 bank 这个 index 中 address 字段中蕴含 “cove” 或者 蕴含 “lane” 的的数据,咱们能够如下操作:

GET /bank/_search
{
  "query": {"match": {"address": "Cove Lane"}
  }
}

这条语句相似于 sql 中的:

where address like "%cove%" or address like "%lane%"

只有 address 的字符蕴含 cove 或者 lane 之一即可。

而如果咱们想要实现 cove lane 作为一个整体进行查问,咱们能够应用 match_phrase 来实现:

GET /bank/_search
{
  "query": {"match_phrase": {"address": "Cove Lane"}
  }
}

这个操作相似于 sql 中的:

where address like "%mill lane%"

下面这些 match 操作都是大小写不敏感的。

对于 match 和 match_phrase 的筛选形式这里只做一个示例,在前面我会单开一篇笔记具体介绍其用法,针对 text 类型和 keyword 类型的字段。

5、多条件查问

多条件,就是与或非连贯操作,相似于 sql 中的 and、or、not,对应在 es 中就是 must,should,must_not

在 es 中,每个连贯操作都是一个数组,用于连贯多个条件操作,示例如下:

GET /bank/_search
{
  "query": {
    "bool": {
      "should": [{"match": {"age": 24}},
        {"match": {"age": 25}}
      ],
      "must_not": [{"match": {"gender": "M"}}
      ]
    }
  }
}

能够看到,与或非的操作咱们是在 query 的 bool 这个 key 的下一级,这个查问对应的 sql 的查问是:

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 的数据

GET /bank/_search
{
  "query": {
    "bool":{
      "filter": {
        "range": {
          "age": {
            "gte": 21,
            "lte": 22
          }
        }
      }
    }
  }
}

下面的操作能够和与或非的操作进行并列,如果是间接搜寻大小于的操作,能够间接如下操作:

GET /bank/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

如果想获取更多后端相干文章,可扫码关注浏览:

正文完
 0