大家好,我是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. .NET Core & ConsoleApp & appsettings.json

    准备 Visual Studio 2017 .NET Core 2.1 新建控制台应用(.NET Core) 默认的 Program.cs // Program.cs using System; na ...

  2. Ubuntu下RabbitVCS的安装和简单使用

    最近需要在Ubuntu下玩一段时间,但是没找类似TortoiseSVN的熟悉点的Subversion工具,无意间发现了RabbitVCS,操作上非常nice,留爪. 下载 RabbitVCS Rabb ...

  3. Ubuntu下Ibus和fcitx的奇葩问题

    最近装了个Ubuntu,捉鸡的输入法令人哀伤. 于是乎,卸载了自带Ibus和fcitx出现各种问题,留爪. 首先,卸载了Ibus,会出现的问题如下: 注销/重启系统有问题 系统设置菜单选项缺失 -&g ...

  4. python练习-爬虫(续)

    流程: 1 设置url 2 设置消息头 3 设置消息体 4 获取响应 5 解析相应 6 验证数据 接下来就是查询数据了. # 识别图片中的文字 #image = Image.open('captcha ...

  5. P3392 涂国旗 题解

    题目大意 题目真的是不说人话...... 有一个国家的国旗是由一个 N * M 的方格组成的.如果想要这面国旗合法,就必须满足要求: 国旗从上到下必须是白色.蓝色和红色,顺序不能改变. 每一种颜色都至 ...

  6. adb环境配置笔记

    adb环境配置不需要先配置好jdk,然后配置adb环境,才能命令行运行adb https://blog.csdn.net/shengmer/article/details/79027828 https ...

  7. Debug调试(使用IDEA的断点调试功能,查看程序的运行过程)

    一. 1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 2. 点击Debug运行模式 3. 程序停止在断点上不再执行,而IDEA最下方打开了Debug ...

  8. Java高效合并Excel报表实战:GcExcel让数据处理更简单

    前言:为什么需要自动化合并Excel? 在日常办公场景中,Excel报表合并是数据分析的基础操作.根据2023年企业办公效率报告显示: 财务人员平均每周花费6.2小时在Excel合并操作上 人工合并的 ...

  9. js移动端判断跳转

    js移动端判断跳转,只一行 默默收藏 if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobil ...

  10. 可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)

    1. 题目 描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 数据范围:0≤n≤1500,树上每个节点的val满足 |val| <= 1500 ...