Query DSL 是一个 Java 开源框架,用于构建 类型安全 的 SQL 查询语句。采用 API 代替传统的拼接字符串 来构造查询语句。 目前 Querydsl 支持的平台包括 JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。Elasticsearch 提供了一整套基于 JSON 的查询 DSL 语言来定义查询。 Query DSL当作是一系列的抽象的查询表达式树 (AST) 特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score), 还有的可以同时包含查询和过滤器 (如 filtered). 都能够从 ES 支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器, 这样的话,我们就可以构造出任意复杂(maybe 非常有趣)的查询了。 会使用 DSL 语句后,我们就不需要另外构建项目去操作索引库啦。

1、索引操作

(1)查询所有索引

GET /_cat/indices?v

运行结果:
在这里插入图片描述
(谷歌浏览器和联系浏览器对中文支持都不友好😣,可以用火狐浏览器。)
    
(2)删除某个索引

DELETE /索引库名称

在这里插入图片描述
(语句结束不需要 “;” 的。)
    
(3)新增索引

PUT /索引库名称

在这里插入图片描述
(4)创建映射

PUT /索引库名称/类型/_mapping
{属性}

比如:
在这里插入图片描述
运行结果:
在这里插入图片描述
     可以看到,映射添加成功啦。
    
(5)新增文档数据

PUT /索引库/类型/记录下标
{数据}

在这里插入图片描述
     注意到,id=5 的数据 比其他数据多了 “address” 属性。

(6)修改数据

替换操作
     更新数据可以使用之前的增加操作,这种操作会将整个数据替换掉,比如:

#更新数据,id=4
PUT /user/userinfo/4
{
  "name":"张三丰",
  "description":"在武汉读书,家在武汉!在深圳工作!"
}

使用 GET 命令查看:

#根据ID查询
GET /user/userinfo/4

运行结果:
在这里插入图片描述
     可以看到,使用 PUT ,只剩下 name 和 description 域了,实际上是先删除了原始数据,再新增数据。

更新操作

     我们先使用下面命令恢复数据,使得有 name 、age、city 和 description 域:

# 恢复文档数据 id=4
PUT /user/userinfo/4
{
  "name":"张三丰",
  "age":66,
  "city":"武汉",
  "description":"在武汉读书,家在武汉!"
}

     然后使用 POST 更新某个列的数据。

POST /user/userinfo/4/_update
{
  "doc":{
    "name":"张三丰",
    "description":"在武汉读书,家在武汉!在深圳工作!"
  }
}

使用 GET命令,根据 ID 查询:

在这里插入图片描述

     可以看到,四个域都在的,PUT 操作是直接修改指定域的数据。

(7)删除数据

#删除数据
DELETE /索引库/类型/记录下标
2、数据查询

(1)查询所有数据

#查询所有
GET /索引库名称/_search

在这里插入图片描述
也可以指定类型,比如
在这里插入图片描述
(2)根据 ID 查询

#根据ID查询
GET /索引库名称/类型/ID

运行结果:
在这里插入图片描述
(3)Sort 排序

GET /索引库名称/类型/_search
{
 "query":{
 # 查询所有 "match_all":{}
 },
 "sort"{
  {
   "属性名":{
     "order":"desc"
    }
  }  
}

在这里插入图片描述

(4)分页查询

#分页实现
GET /user/_search
{
  "query":{
    "match_all": {}
  },
  "sort":{
    "age":{
      "order":"desc"
    }
  },
  "from": 0,
  "size": 2
}

     只需要在末尾加 “from” 和 “size”,from 表示 从下标为 xxx的记录开始查询,size 表示 每页显示条数。

3、过滤查询

(1)term 过滤

     term 主要用于 分词精确匹配,如 字符串、数值、日期等。
     不适合情况:

  • 列中除英文字符外有其它值
  • 字符串值中有冒号或中文
  • 系统自带属性,如_version

例:

#过滤查询-term
GET _search
{
  "query":{
    "term":{
      "city":"武汉"
    }
  }
}

运行结果:
效果如下:

(2)terms 过滤
     terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配 。
例:

#过滤查询terms 允许多个term
GET _search
{
  "query":{
    "terms":{
      "city":
        [
          "武汉",
          "广州"
        ]
    }
  }
}

运行结果:

1564608161056

(3) range 过滤
     range 过滤 允许我们按照指定范围查找一批数据。
例:查询年龄范围

# 过滤-range 范围过滤
# gt表示> gte表示=>
# lt表示< lte表示<=
GET _search
{
  "query":{
    "range": {
      "age": {
        "gte": 30,
        "lte": 57
      }
    }
  }
}

运行结果:
在这里插入图片描述
(4)exists过滤

     exists 过滤可以用于查找拥有某个域的数据。
例:

# 过滤搜索 exists:是指包含某个域的数据检索
GET _search
{
  "query": {
    "exists":{
      "field":"address"
    }
  }
}

运行结果:
在这里插入图片描述
(5) bool 过滤
     bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:

  • must : 多个查询条件的完全匹配,相当于 and。
  • must_not : 多个查询条件的相反匹配,相当于 not。
  • should : 至少有一个查询条件匹配, 相当于 or。
         这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:
        
    例:
#过滤搜索 bool 
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": {
              "value": "深圳"
            }
          }
        },
        {
          "range":{
            "age":{
              "gte":20,
              "lte":99
            }
          }
        }
      ]
    }
  }
}

运行结果:
在这里插入图片描述
(6) match_all 查询

     可以查询到所有文档,是没有查询条件下的默认语句。
例:

#查询所有 match_all
GET _search
{
  "query": {
    "match_all": {}
  }
}

运行结果:
在这里插入图片描述

(7) match 查询
     match 查询,根据字符串进行匹配,是一个标准查询,无论是需要全文本查询,还是精确查询,都可以用它。
     如果使用 match 查询一个全文本字段,它会在真正查询之前,用分析器先分析 match 一下查询字符。

例:

#字符串匹配
GET _search
{
  "query": {
    "match": {
      "description": "武汉"
    }
  }
}

运行结果:
在这里插入图片描述
在这里插入图片描述
    可以看到,按照 ”武汉“ 和 ”湖北武汉“ 进行搜索,结果是不一样的。(不过使用 term 对 ”武汉“ 和 ”湖北武汉“ 进行搜索,和 使用 match 是没有区别的。)

(8)prefix 查询

     以字符作为前缀查找的,可以更简单地用 prefix 。

如:查询所有以 ”赵 “ 开始的用户描述

# 前缀匹配 prefix
GET _search
{
  "query": {
    "prefix": {
      "name": {
        "value": "赵"
      }
    }
  }
}

运行结果:
在这里插入图片描述

(9)multi_match 查询
     multi_match 查询 允许 在做 match 查询的基础上,同时搜索多个字段。
例:

#多个域匹配搜索
GET _search
{
  "query": {
    "multi_match": {
      "query": "深圳",
      "fields": [
        "city",
        "description"
      ]
    }
  }
}

运行结果:
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐