当前位置:   article > 正文

ElasticSearch:查询操作合集_elasticsearch查询

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/842355
推荐阅读
相关标签
  

闽ICP备14008679号