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. js遍历localStorage的键值对

    //遍历本地存储localStorage for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i ...

  2. pgloader 学习(九) pg 2 pg 使用with 参数控制同步逻辑

    pgloader 支持比较丰富的配置参数,同时默认数据在同步的时候是会进行索.schema 以及数据的同步对于实际我们可能存在需要进行控制,我们可以通过with 参数方便的处理 参考配置 load 文 ...

  3. zabbix-trap

    安装 yum -y install zabbix-sender zabbix sender 在客户端给server端发送信息, -z 指定server的ip -p 指定端口 10051 -s 被监控设 ...

  4. Spyder汉化问题

    首先感谢李增海大神,以下内容来源于http://www.lizenghai.com 必备条件 1.已安装Spyder 2.Spyder版本在3.X以上 Spyder安装: 1.anaconda下,co ...

  5. GoCN每日新闻(2019-10-22)

    GoCN每日新闻(2019-10-22) GoCN每日新闻(2019-10-22) 1. Go 集成测试:https://www.ardanlabs.com/blog/2019/10/integrat ...

  6. CSS — BEM 命名规范

    推荐阅读: https://juejin.im/post/5b925e616fb9a05cdd2ce70d 1 什么是 BEM 命名规范 Bem 是块(block).元素(element).修饰符(m ...

  7. 平安银行Java面试-社招-五面(2019/09)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  8. jmeter(四十四)常用性能指标分析

    概述 我们在用jmeter做性能测试的时候,有一些关键性的性能指标需要去分析.但是由于开源工具本身的局限性,这些指标在工具中的命名极易对我们造成混淆.所以我们需要对这些指标一一进行剖析. 指标分析 响 ...

  9. MySql 三大知识点——索引、锁、事

    作者:莫那鲁道原文:http://thinkinjava.cn/2019/03/16/2019-03-16-mysql/ 1. 索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容. ...

  10. Servlet相关的几种乱码

    1. 页面中文显示乱码 原因: response中的内容会先输入到response缓冲区,然后再输入到传给浏览器,所以要将缓冲区和浏览器的编码都设置成utf-8 1)未使用jsp,而是在servlet ...