1、 什么是DSL查询 

  由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。

  DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。  

  DSL查询是ES提供的通用查询方式,这种方式最大的特点是开发语言的无关性,即任意的客户端只要支持HTTP请求,就可以通过JSON格式的查询数据完成复杂的搜索。

  

  对于简单查询,使用查询字符串比较好,但是对于复杂查询,由于条件多,逻辑嵌套复杂,查询字符串不易组织与表达,且容易出错,因此推荐复杂查询通过DSL使用JSON内容格式的请求体代替。

  DSL有两个部分组成:DSL查询DSL过滤

  DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:

  DSL过滤(精确查找)查询文档的方式更像是对于我的条件“有”或者“没有”,而DSL查询(模糊查询)则像是“有多像”。

  

  DSL过滤和DSL查询在性能上的区别

     过滤结果可以缓存并应用到后续请求。

    查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。

     过滤语句可有效地配合查询语句完成文档过滤。

  原则上,使用DSL查询做全文本搜索或其他需要进行相关性评分的场景,其它全用DSL过滤。

2、 DSL查询 

  使用DSL查询,必须要传递query参数给ES。

  GET _search

  {"query": YOUR_QUERY_HERE}

  一个常用的相对完整的DSL查询:

GET itsource/employee/_search

  {

  "query": {

     "match": {"sex":"女"}

  },

   "_source": ["id","name"],

  "from": 20,

  "size": 10,

  "sort": [{"join_date": "desc"},{"age": "asc"}]

  }

  select id,name from t_user where name like “%heh%” order by id desc limit 0,10.

  上面的DSL查询语句代表:查询公司员工性别为女的员工,并按照加入时间降序、年龄升序排列,最终返回第21条至30条数据(只返回名字、年龄和email字段)

3、DSL过滤 

  模糊查询用DSL的查询语句,精确查询用DSL过滤语句。

2.0以上的用法
{
  "query": {
  "bool": {
"must": [
        {"match": {"description": "search" }}
      ],
"filter": {
"term": {"age": "12"}
}
  }
  },
  "_source": ["id","name"],
  "from": 20,
  "size": 10,
  "sort": [{"join_date": "desc"},{"age": "asc"}] }

4、使用DSL查询与过滤

  ① 全匹配(match_all)

  普通搜索(匹配所有文档):

{
  "query" : {
    "match_all" : {}
  }
}

  如果需要使用过滤条件(在所有文档中过滤,红色部分默认可不写):

{
  "query" : {
    "bool" : {
      "must" : [{
        "match_all":{}
      }],
      "filter":{....}
    }
  }
} 

  ② 标准查询(match和multi_match)

  match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。

  如果你使用match查询一个全文本字段,它会在真正查询之前用分析器先分析查询字符:

{
  "query": {
    "match": {
      "fullName": "Steven King"
    }
  }
} 

  上面的搜索会对Steven King分词,并找到包含Steven或King的文档,然后给出排序分值。

  如果用 match  下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed的字符串时,它将为你搜索你给定的值,如:

{ "match": { "age": 20 }}

{ "match": { "date": "2016-05-01" }}

{ "match": { "public": true }}

{ "match": { "tag": "full_text" }}

  multi_match  查询允许你做 match查询的基础上同时搜索多个字段:

{
  "query":{
    "multi_match": {
      "query": "Steven King",
      "fields": [ "fullName","title" ]
    }
  }
} 

  上面的搜索同时在fullName和title字段中匹配。

  提示:match一般只用于全文字段的匹配与查询,一般不用于过滤。

  ③单词搜索与过滤(Term和Terms

{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "age": "20"
        }
      }
    }
  }
} 

  Terms搜索与过滤

{
"query": {
"terms": {
"tags": ["jvm", "hadoop", "lucene"],
"minimum_match": 2
}
}
}

  minimum_match:至少匹配个数,默认为1

  ④ 组合条件搜索与过滤(Bool

  组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。

  例如:查询爱好有吃米饭,同时也有喜欢游戏或运动,且出生于1990-06-30及之后的人。Range:范围

{
  "query": {
    "bool": {
      "must": [{"term": {"hobby": "吃米饭"}}],
      "should": [{"term": {"hobby": "游戏"}},
        {"term": {"hobby": "运动"}}
      ],
      "must_not": [
        {"range" :{"birth_date":{"lt": "1990-06-30"}}}
      ],
"filter": [...],
     "minimum_should_match": 1
    }
  }
}

  提示: 如果 bool 查询下没有must子句,那至少应该有一个should子句。但是 如果有 must子句,那么没有 should子句也可以进行查询。  

  ⑤ 范围查询与过滤(range

  range过滤允许我们按照指定范围查找一批数据:

{
  "query":{
    "range": {
      "age": {
        "gte": 20,
        "lt": 30
      }
    }
  }
}

  上例中查询年龄大于等于20并且小于30。

  gt:>    gte:>=   lt:<  lte:<=

  

  ⑥ 存在和缺失过滤器(exists和missing

{
  "query": {
    "bool": {
      "must": [{
        "match_all": {}
      }],
      "filter": {
        "exists": { "field": "gps" }
      }
    }
  }
}

  提示:exists和missing只能用于过滤结果。

  ⑦ 前匹配搜索与过滤(prefix

  和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’

{
  "query": {
    "prefix": {
      "fullName": "黄"
    }
  }
}

  上例即查询姓黄的所有人。

  ⑧ 通配符搜索(wildcard

  使用*代表0~N个,使用?代表1个。

{
  "query": {
    "wildcard": {
      "fullName": "文*华"
    }
  }
}

DSL查询与过滤的更多相关文章

  1. Elasticsearch 查询与过滤

    今天在给上级汇报工作的时候,被问到了这个问题,一时也没回到上来. 英文原文: https://www.elastic.co/guide/en/elasticsearch/guide/current/_ ...

  2. Elasticsearch Query DSL查询入门

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

  3. ES 20 - 查询Elasticsearch中的数据 (基于DSL查询, 包括查询校验match + bool + term)

    目录 1 什么是DSL 2 DSL校验 - 定位不合法的查询语句 3 match query的使用 3.1 简单功能示例 3.1.1 查询所有文档 3.1.2 查询满足一定条件的文档 3.1.3 分页 ...

  4. ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询

    基本概念 索引: 类似于MySQL的表.索引的结构为全文搜索作准备,不存储原始的数据. 索引可以做分布式.每一个索引有一个或者多个分片 shard.每一个分片可以有多个副本 replica. 文档: ...

  5. ElasticSearch DSL 查询

    公号:码农充电站pro 主页:https://codeshellme.github.io DSL(Domain Specific Language)查询也叫做 Request Body 查询,它比 U ...

  6. elasticsearch的dsl查询

    测试es的dsl查询,准备数据,在插入数据的时候,如果index.type.mapping都没有,es会自动创建 一.数据的准备 curl -XPOST "http://192.168.99 ...

  7. ELK学习笔记(五)简单搜索和DSL查询

    检索文档 现在我们有一些数据存储在Elasticsearch中,我们可以开始处理这个应用程序的业务需求. 这在Elasticsearch中很容易.我们只需执行HTTP GET请求并指定文档的地址--索 ...

  8. MySQL全面瓦解7:查询的过滤条件

    概述 在实际的业务场景应用中,我们经常要根据业务条件获取并筛选出我们的目标数据.这个过程我们称之为数据查询的过滤.而过滤过程使用的各种条件(比如日期时间.用户.状态)是我们获取精准数据的必要步骤, 这 ...

  9. es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高亮查询、聚合函数、python操作es

    今日内容概要 es的查询 Elasticsearch之排序查询 Elasticsearch之分页查询 Elasticsearch之布尔查询 Elasticsearch之查询结果过滤 Elasticse ...

随机推荐

  1. 2019-2020-1 20199302《Linux内核原理与分析》第十一周作业

    缓冲区溢出 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢 ...

  2. 程序复杂程度(步长) N

    我们知道计算机在运算时速度是固定的,程序运行的时间就与程序复杂程度有关.例如我们计算1-10相加 与 1-100相加,后者就要比前者多10倍时间. 例1  找出n个数中最大的一个  max= n[0] ...

  3. edgedb-js 来自官方的js 驱动

    目前对于edgedb 主要还是来自官方的python驱动,目前js 版本的已经快发布了,代码在github 可以看到了 同时官方文档也提供了一个关于edgedb 内部的协议说明,结合js 驱动以及文档 ...

  4. zeptojs库

    一.简介 ①Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. ②Zepto的设计目的是提供 jQuery 的类似的API,但并不是100%覆盖 ...

  5. C# DataTable转换为Html

    /// <summary> /// DataTable 转换为 Html /// </summary> /// <param name="dt"> ...

  6. Web前端开发工具和环境清单

    初级 浏览器 Google Chrome 75.0.3770.100www.google.cn/intl/zh-CN/chrome初级 移动端模拟器 Genymotion 6.0.6www.genym ...

  7. shell脚本编程之变量的小用法

    变量赋值 ${parameter:-word}:如果parameter为空或未定义,则变量展开为"word":否则,展开为parameter的值: ${parameter:+wor ...

  8. Comparison of SIFT Encoded and Deep Learning Features for the Classification and Detection of Esca Disease in Bordeaux Vineyards(分类MobileNet,目标检测 RetinaNet)

    识别葡萄的一种虫害,比较了传统SIFT和深度学习分类,最后还做了目标检测 分类用的 MobileNet,目标检测 RetinaNet MobileNet 是将传统深度可分离卷积分成了两步,深度卷积和逐 ...

  9. Spring AOP的实现记录操作日志

    适用场景: 记录接口方法的执行情况,记录相关状态到日志中. 注解类:LogTag.java package com.lichmama.spring.annotation; import java.la ...

  10. Jmeter5.11安装

    jmeter5.11要对应jdk1.8以上版本 1.选择zip后缀进行下载 2.配置环境变量 (1)电脑桌面---->"计算机"图标---->鼠标右键选择"属 ...