本文首发于公众号: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
}
}
}
}

如果想获取更多后端相关文章,可扫码关注阅读:

es 笔记二之基础查询的更多相关文章

  1. HTML5学习笔记二 HTML基础

    一.HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. <h1>标题一</h1> <h2>标题二& ...

  2. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  3. Java基础学习笔记(二) - 面向对象基础

    面向对象 一.面向对象概述 面向对象思想就是在计算机程序设计过程中,参照现实事物,将事物的属性特征.行为特征抽象出来,描述成计算机时间的设计思想.面向对象思想区别于面向过程思想,强调的是通过调用对象的 ...

  4. Spring Data Jpa (二)JPA基础查询

    介绍Spring Data Common里面的公用基本方法 (1)Spring Data Common的Repository Repository位于Spring Data Common的lib里面, ...

  5. Java 8实战之读书笔记二:基础知识

    好记性不如烂笔头,整理一些个人觉得比较重要的东西. 一.基础知识 第1章 为什么要关心Java 8 Java 8提供了一个新的API(称为"流", Stream),它支持许多处理数 ...

  6. C++Primer学习笔记(二、基础)

    1.两种初始化方式,直接初始化语法更灵活,且效率更高. ); // 直接初始化 direct-initialization ; // 赋值初始化 copy-initialization 2.const ...

  7. SQL查询刚開始学习的人指南读书笔记(二)创建SQL查询

    PARTII: SQL Basics CHAPTER 4Creating a Simple Query 介绍一种怎样创建SQL语句的技术--"Request/Translation/Clea ...

  8. SQL语句(一)基础查询与过滤数据

    目录 一.数据库测试表 二.基础查询 1. 获得需要的记录的特定字段 2. 查询常量值 3. 查询表达式 4. 查询函数 5. 起别名 6. 去重 7. CONCAT函数的简单使用 三.过滤数据 大纲 ...

  9. 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲

    目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...

  10. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

随机推荐

  1. Linux提权-权限升级

    特权升级是一段旅程.没有灵丹妙药,很大程度上取决于目标系统的具体配置.内核版本.已安装的应用程序.支持的编程语言.其他用户的密码是影响您通往 root shell 之路的几个关键因素 什么是特权升级? ...

  2. 痞子衡嵌入式:MCUBootUtility v2.3.1发布,解决了长久以来非空flash可能无法下载的问题

    -- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.3)发布过去3个月了,这一次痞子衡为大家带来了小版本升级v2.3.1(第一次做x.y.z中z级别更新),这个版本主要有两 ...

  3. 如何使用Mutex确保并发程序的正确性

    1. 简介 本文的主要内容是介绍Go中Mutex并发原语.包含Mutex的基本使用,使用的注意事项以及一些实践建议. 2. 基本使用 2.1 基本定义 Mutex是Go语言中的一种同步原语,全称为Mu ...

  4. Linux设备驱动那些事

    目的 初步了解 linux 设备驱动框架模型 初步了解设备驱动模型有哪些元素 设备驱动模型元素的说明及解释 设备驱动模型元素的工作原理 设备驱动模型的小例子 对整体有个粗略的了解,设备驱动类型种类太多 ...

  5. 001-ksum 求符合条件的 k 个数 1. Two Sum/15. 3Sum/18. 4Sum/

    推荐阅读 000-从零开始的数据结构与算法 001-01-ksum 求符合条件的 k 个数 1. Two Sum/15. 3Sum/18. 4Sum/ 002-两数相加 add two numbers ...

  6. Lua基础语法学习笔记

    Lua是一门语言,我们可以使用一个库,可以在运行时去编译执行Lua中的代码,从而实现自己的内存中的数据和逻辑: 准备学习环境: 新建一个Lua项目目录,用来写我们的Lua代码: 进入目录,右键使用vs ...

  7. AlphaFold2中的残基刚体表示

    技术背景 在前面的这一篇博客中,比较全面的介绍了组成蛋白质的各种氨基酸的三维结构.由于每个氨基酸大小不一,在传统的蛋白质折叠预测的方案中,一般会考虑全原子方案或者是粗粒化方案.对于全原子方案而言,即时 ...

  8. 三分钟速览GPT系列原理

    其中,Transformer和BERT来自Google,GPT系列[GPT.GPT-1.GPT-2.GPT-3.ChatGPT.GPT-4]来自OpenAI. GPT Paper名为Improving ...

  9. [git] 规范Commit格式

    规范Commit格式 Jenkins根据对比当次构建和上次构建的Commit信息来生成ChangeLog,但因为我们目前的提交不够规范,经常有类似"#","update& ...

  10. MySQL(四)用户与权限管理

    用户与权限管理 用户管理 MySQL用户分为普通用户和root用户,提供了许多语句来管理包括登录.退出MySQL服务器.创建用户.删除用户.密码管理和权限管理等内容. 登录MySQL服务器 mysql ...