• ElasticSearch:查询操作合集


    先看下我的数据:
    在这里插入图片描述

    1、查询所有文档:

    GET /cartest/_search
    
    • 1

    或者

    GET /cartest/_search
    {
      "query": {
        "match_all": {}
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、匹配查询:

    match匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系

    GET /cartest/_search
    {
      "query": {
        "match": {
          "name": "风云"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    3、字段匹配查询:

    multi_match 与match类似,不同的是它可以在多个字段中查询。

    在这里插入图片描述

    4、关键字精准查询:

    这个term查询不对查询条件进行分词,
    要是text文本类型就会出错,keyword可以进行此类查询

    这里我们查 name:风云 就什么都没查到
    在这里插入图片描述
    向 cartest 中再加一个keyword类型的class字段

    PUT /cartest/_mapping
    {
    	 "properties": {
    		 "class":{
    			 "type": "keyword",
    			 "index": true
    		 }
    	 } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    添加一条数据

    POST /cartest/_doc
    {
      "name": "wang",
      "page": "cn",
      "say": "欢迎",
      "time": "2020-12-11",
      "class": "box"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    我们再次查询:

    GET /cartest/_search
    {
       "query": {
         "term": {
           "class": {
            "value": "box"
           }
         }
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    5、多关键字查询:

    terms 查询和term 查询一样,但它允许你指定多值进行匹配。
    如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in
    当然,一定要记得查询的字段为关键字keyword类型,不然查不到内容

    GET /cartest/_search
    {
       "query": {
         "terms": {
           "class": ["box", "box-1"]
         }
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    6、组合查询:

    bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合

    在这里插入图片描述

    7、范围查询:

    操作符说明
    gt大于>
    gte大于等于>=
    lt小于<
    lte小于等于<=

    查询 num 100 - 150之间的数据

    GET /cartest/_search
    {
      "query": {
       "range": {
         "num": {
           "gte": 100,
           "lte": 150
         }
       }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    查询 04 - 06号之间的数据
    在这里插入图片描述

    8、分页查询+排序:

    也可设置多字段排序,主次为代码顺序

    GET /cartest/_search
    {
      "query": {
        "match_all": {}
      },
      "sort": [
        {
          "num": {
            "order": "desc"
          }
        }
      ],
      "from": 0,
      "size": 3
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    当然也可以按时间排序
    在这里插入图片描述
    9、查询需要的字段

    GET /cartest/_search
    {
      "_source": ["name", "time", "num"],
      "query": {
        "match_all": {}
      },
      "sort": [
        {
          "time": {
            "order": "desc"
          }
        }
      ],
      "from": 0,
      "size": 3
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    10、过滤查询:

    includes:来指定想要显示的字段
    excludes:来指定不想要显示的字段

    只显示 name time 字段
    在这里插入图片描述
    不显示 name time 字段
    在这里插入图片描述

    11、聚合查询:

    聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很
    多其他的聚合,例如取最大值、平均值等等。

    获取 num 最大值,size是 hits中数值的数量

    GET /cartest/_search
    {
      "aggs": {
        "max_age": {
          "max": {
            "field": "num"
          }
        }
      },
      "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    平均值:
    在这里插入图片描述
    12、正则查询

    GET /cartest/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "regexp": {
                "name": ".*云.*"
              }
            }
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    13、多层数据查询

    GET /testes/_search
    {
      "query": {
        "match": {
          "fun.active": "进行中"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    14、nested:嵌套数据类型,可以看成是一个特殊的对象类型,可以让对象数组独立检索
    一个例子说明nested类型的作用
    (1)Nested:嵌套对象是object数据类型的专用版本,能够对 对象数组进行彼此独立地索引和查询。

    (2)对象数组默认组织形式

    内部对象字段数组的实际存储机制与我们想的不一样。Lucene没有内部对象的概念,因为ElasticSearch将对象层次结构扁平化为一个字段名和字段值的列表。例如下面文档。

    PUT user/_doc/1
    {
      "group" : "man",
      "userName" : [ 
        {
          "first" : "张",
          "last" :  "三"
        },
        {
          "first" : "李",
          "last" :  "四"
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这里想要查询first为“张”,last为“四”的数据,按照我们的理解应该没有这种数据。按如下语句查询。

    GET /user/_search
    {
     "query":{
        "bool":{
        "must":[
          {
            "match":{
              "userName.first":"张"
            }
          },
          {
            "match":{
              "userName.last":"四"
            }
          }
        ]
       }
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    查询结果如下:居然查询到了。这显然不符合我们的预期。
    在这里插入图片描述
    这个原因就是前面所说的lucene没有内部对象的概念,所谓的内部对象实际是被扁平化为一个简单的字段名称和值列表。文档内部存储是这个样子的:

    {
      "group" :        "human",
      "sex" :          "man",
      "userName.first" : [ "张", "李" ],
      "userName.last" :  [ "三", "四" ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    显然 userName.first 和 userName.last 字段平面化为多值字段,之前的关联性丢失,查询就不会得到预期的结果。

    那么要如何实现自己想要的语义呢? —— 显然就是本文想要说的nested了。

    // 第一步先声明类型
    PUT order
    {
      "mappings": {
        "properties": {
          "goods_list": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "text"
              }
            }
          }
        }
      }
    }
    // 第二步 添加数据
    PUT /order/_doc/1
    {
      "total_price": 126,
      "goods_list": [
        {
          "name": "xiaomi",
          "price": 30
        },
        {
          "name": "guang",
          "price": 19
        },
        {
          "name": "liang",
          "price": 20
        }
      ]
    }
    // 查询
    GET order/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "goods_list",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "match": {
                          "goods_list.name": "guang"
                        }
                      },
                      {
                        "match": {
                          "goods_list.price": 20
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    这时是查不出来的,符合预期
    在这里插入图片描述
    这样就可以查询到了
    在这里插入图片描述

  • 相关阅读:
    使用SPI解耦服务调用
    SpringSecurity系列 - 11 前后端分离表单认证:自定义过滤器替换 UsernamePasswordAuthenticationFilter
    myCat实现分库分表
    Redis 多机方案
    svn co 大型项目
    FPGA零基础学习:数字电路中的数字表示
    如何利用InVest模型估算区域产水量
    0和1的歧义问题
    【毕业设计】基于树莓派的指纹识别与RFID考勤系统 - 嵌入式 单片机 物联网
    “前端工程化”到底是何方神圣?
  • 原文地址:https://blog.csdn.net/weixin_44384273/article/details/137920183