大家好,我是Edison。首先说声抱歉,这个ES学习系列很久没更新了,现在继续吧。

上一篇:ES的倒排索引和Analyzer

什么是Query DSL

DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。

在ElasticSearch中,DSL指的是Elasticsearch Query DSL,是一种以JSON形式表示的查询语言。通过这种语言,用户可以构建复杂的查询、排序和过滤数据等操作。这些查询可以是全文搜索、聚合搜索,也可以是结构化的搜索。

Elastic Query DSL的基本语法如下:

# 基本格式
GET /es_db/_doc/_search {json-request-body}
# 简化格式
GET /es_db/_search {json-request-body}

match_all

使用match_all就类似于SQL中的SELECT *了,它会匹配所有文档,但默认只会返回10条数据。这是因为,_search查询默认采用的是分页查询,每页size默认值就是10,因此如果想显示更多,请制定size。

// 匹配所有文档,默认分页只返回10条
GET users/_search
{
"query":
{
"match_all":{}
}
}
// 设置分页的每页条数size值为20
GET users/_search
{
"query":
{
"match_all":{}
},
"size": 20
}

分页查询 from & size & sort

分页查询最重要的3个参数:from 、size 和 sort。

from: 显示应该跳过的初始结果数量,默认是0。

size: 显示应该返回的结果数量,默认是10,刚刚有演示。

sort: 根据什么字段 以及 升序 或 降序 来排序。

// 从第5个文档开始取10个显示,并根据用户名升序排列
GET users/_search
{
"query":
{
"match_all":{}
},
"sort":
{
"user": "asc"
}
"from": 5
"size": 20
}

_source 过滤

_source参数就好比SELECT field1, field2,当我们需要只查询某些特定字段时,就可以使用_source参数来进行过滤。_source支持使用通配符,可以较为方便的编写,如:_source["name*","desc*"]。

# 只查询users中的user和message两个字段数据,过滤掉其他字段
GET users/_search
{
"_source": ["user","message"],
"query":
{
"match_all":{}
},
"from": 0,
"size": 20
}

match 查询表达式

match 查询表达式可能是我们用的最多的参数了,它会在匹配时对所查找的关键词进行分词,然后按照分词匹配查找。

match 支持以下参数:

  • query 指定匹配的值

  • operator 匹配条件类型

  • and 条件分词后都要匹配

  • or 条件分词后有一个匹配即可(默认的operator类型

// 默认为or => comments字段中有文档出现任意一个Song or Last or Christmas
GET comments/_search
{
"query":
{
"match":
{
"comment":
{
"query": "Song Last Christmas"
}
}
}
} // 手动指定and => comments字段中有文档同时出现Song Last Christmas
GET comments/_search
{
"query":
{
"match":
{
"comment":
{
"query": "Song Last Christmas",
"operator": "and"
}
}
}
}

multi_match 多字段查询表达式

上面演示的是针对单个字段的查询,那么如果想要针对多个字段查询呢?

使用multi_match即可,指定fields:

GET comments/_search
{
"query":
{
"multi_match":
{
"query": "Song Last Christmas",
"fields": ["comments", "address"]
}
}
}

match_phrase 短语查询表达式

短语查询会对搜索文本进行文本分析,然后才到索引中寻找搜索的每个分词并要求分词相邻。我们可以通过slop参数设置分词出现的最大间隔距离,可以通过下面的例子来看看。

// 查询one love这个短语出现过的文档
POST movies/_search
{
"query":
{
"match_phrase": {
"title": {
"query": "one love"
}
}
}
}
// 只要one和love之间间隔不超过1个词就都显示出来
POST movies/_search
{
"query":
{
"match_phrase": {
"title": {
"query": "one love",
"slop": 1
}
}
}
}

搜索结果:One I Love

query_string 与 simple_query_string

Query String类似于URI Query,这种查询方式的语法和我们在SQL中的WHERE语句就有些类似了,基于OR/AND/NOT等运算符来解析和拆分提供的查询字符串,我们可以使用 Query String 查询创建一个较为复杂的搜索,其中可以包括通配符、跨多个字段的搜索等。

虽然用途广泛,但是语法较为严格,容易出错,不推荐在日常查询中使用。

// 查询单个字段
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "Chengdu AND Shuangliu"
}
}
} // 查询多个字段
GET /bank/_search
{
"query": {
"query_string": {
"fields": ["name", "address"],
"query": "(Edison AND Zhou) OR (Chengdu AND Shuangliu)"
}
}
}

Simple Query String 顾名思义 就是简单版Query String,它类似于Query String但会忽略错误的语法。此外,它不支持AND OR NOT,会将它们当作字符串来处理。各个Term之间默认的关系是OR,但可以指定Operator来覆盖。

// 默认operator是OR => 出现其一即可 Edison or Zhou
GET /bank/_search
{
"query": {
"simple_query_string": {
"query": "Edison Zhou",
"fields": ["name"]
}
}
}
// 覆盖默认operator 改为AND => 必须完整出现 Edison Zhou
GET /bank/_search
{
"query": {
"simple_query_string": {
"query": "Edison Zhou",
"fields": ["name"],
"default_operator": "AND"
}
}
}

小结

本篇,我们了解了ElasticSearch的Query DSL,并通过一些查询示例了解了如何使用它。除了本文中介绍的部分高频DSL外,你可以通过搜索阅读其他的关键词进行学习。

参考资料

极客时间,阮一鸣,《ElasticSearch核心技术与实战

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

Elastic学习之旅 (6) Query DSL的更多相关文章

  1. Elasticsearch学习笔记(二)Search API 与 Query DSL

    一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以 ...

  2. Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了

    目录 引言 构建示例 match operator 参数 analyzer lenient 参数 Fuzziness fuzzniess 参数 什么是模糊搜索? Levenshtein Edit Di ...

  3. 48.Query DSL

    主要知识点 1.Query DSL的理解及基本语法 2.如何组合多个搜索条件 bool     一.Query DSL的理解 Query DSL的查询形式如下: GET /_search { &quo ...

  4. 我的AngularJS 学习之旅

    我的AngularJS 学习之旅 基础篇 1.Angular的 起源 2.比较Web 页面实现的几种方式 3.一些基本术语 4.Angular与其他框架的兼容性 5.总结 6.综合实例   很早之前就 ...

  5. Elasticsearch(入门篇)——Query DSL与查询行为

    ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...

  6. Query DSL(1)

    https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl.html Query DSL GET _search { & ...

  7. 开发了5年android,我开始了go学习之旅

    前言 做了近5年的android开发,最近项目也是不怎么忙,空闲的时候总会思考一些事情,不过作为移动开发,我个人觉得很有必要学习后台开发,由于公司是Go语言开发的,了解go语言一段时间后,我发现go语 ...

  8. elasticsearch系列四:搜索详解(搜索API、Query DSL)

    一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...

  9. Elasticsearch Query DSL查询入门

    本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...

  10. elasticsearch入门使用(三) Query DSL

    Elasticsearch Reference [6.2] » Query DSL 参考官方文档 :https://www.elastic.co/guide/en/elasticsearch/refe ...

随机推荐

  1. api使用流程、Scanner键盘录入字符串

    1.api介绍 2.api使用流程 API帮助文档的使用流程 在索引位置搜索自己要查看的类 看包 目的: 是不是java.lang包(核心包), 不需要编写导包代码(import) - 不是java. ...

  2. Quartz.NET - 教程 1: 使用 Quartz

    译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 1: Using Quartz 在你使用调度器之前, 你需要先实例化(能猜到是谁么?). 要实例化, 请使用 ISche ...

  3. ASP.NET Core 阿弥陀佛中间件

    Amitabha n. <梵>(佛)阿弥陀佛 佛曰: 因果 那么一天 看见文章1. 发现还有2.这么个中间件 于是追寻源码,发现了3. 再然后寻思自己也可以写一个什么中间件,以便学习掌握 ...

  4. 再说cxGrid主从表相关

    查了那么多叽叽歪歪的资料:masterView的key,从表key和detailkey以及从表需要排序. 注意设定参数后,最后active数据集.这里有个顺序问题,否则会增加随机新 回到原点看随机he ...

  5. Kubernetes基础教程-通过部署Nginx快速学习基本使用命令

    1.验证节点信息 1.1.查看控制平面组件的状态 [root@linux-servertwo software]# kubectl get cs Warning: v1 ComponentStatus ...

  6. AIR724UG上电后引脚的默认电平

    使用AIR724UG的引脚作为继电器的控制引脚时,由于上电时引脚的电平有的高,有的低. 在某些场合我们希望GPIO上电默认是低电平,所以我将常用引脚中可用的引脚标注了出来.

  7. 自动驾驶仿真全攻略:基于CARLA+YOLOv5的自主导航实战

    引言:自动驾驶仿真的战略价值 在自动驾驶技术落地的前夜,仿真测试正在成为连接算法研发与实际路测的关键桥梁.据统计,自动驾驶系统每1万公里的接管次数需从仿真测试的百万公里级数据中优化,这使得CARLA. ...

  8. Mouse Down鼠标操作指令的用法

    如下图 暂无评论的按钮在整页下方,需要拖动页面才会显示出这个按钮,否则不可点击 Mouse Down  提供拖动页面的能提 这个方法因selenium2library和AutoItLibrary 都有 ...

  9. Java 里的对象在虚拟机里面是怎么存储的?

    Java 中的对象在虚拟机里的存储 在 Java 中,对象在虚拟机中的存储方式取决于 JVM 内存模型,主要存储在 堆(Heap) 中.对象的内存布局和管理方式会影响对象的创建.访问和销毁.下面详细解 ...

  10. 大模型参数组成计算QwQ-32B为例

    计算大模型参数量主要依赖于模型的架构和各层配置,我们把常用大模型分为三层:输入层.transformer层.输出层. 输入层 参数组成是Embedding的词表总和 transformer层 参数组成 ...