先看下我的数据:
1、查询所有文档:
GET /cartest/_search
或者
GET /cartest/_search
{
"query": {
"match_all": {}
}
}
2、匹配查询:
match匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
GET /cartest/_search
{
"query": {
"match": {
"name": "风云"
}
}
}
3、字段匹配查询:
multi_match 与match类似,不同的是它可以在多个字段中查询。
4、关键字精准查询:
这个term查询不对查询条件进行分词,
要是text文本类型就会出错,keyword可以进行此类查询
这里我们查 name:风云 就什么都没查到
向 cartest 中再加一个keyword类型的class字段
PUT /cartest/_mapping
{
"properties": {
"class":{
"type": "keyword",
"index": true
}
}
}
添加一条数据
POST /cartest/_doc
{
"name": "wang",
"page": "cn",
"say": "欢迎",
"time": "2020-12-11",
"class": "box"
}
我们再次查询:
GET /cartest/_search
{
"query": {
"term": {
"class": {
"value": "box"
}
}
}
}
5、多关键字查询:
terms 查询和term 查询一样,但它允许你指定多值进行匹配。
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in
当然,一定要记得查询的字段为关键字keyword类型,不然查不到内容
GET /cartest/_search
{
"query": {
"terms": {
"class": ["box", "box-1"]
}
}
}
6、组合查询:
bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合
7、范围查询:
操作符 | 说明 |
---|---|
gt | 大于> |
gte | 大于等于>= |
lt | 小于< |
lte | 小于等于<= |
查询 num 100 - 150之间的数据
GET /cartest/_search
{
"query": {
"range": {
"num": {
"gte": 100,
"lte": 150
}
}
}
}
查询 04 - 06号之间的数据
8、分页查询+排序:
也可设置多字段排序,主次为代码顺序
GET /cartest/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"num": {
"order": "desc"
}
}
],
"from": 0,
"size": 3
}
当然也可以按时间排序
9、查询需要的字段
GET /cartest/_search
{
"_source": ["name", "time", "num"],
"query": {
"match_all": {}
},
"sort": [
{
"time": {
"order": "desc"
}
}
],
"from": 0,
"size": 3
}
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
}
平均值:
12、正则查询
GET /cartest/_search
{
"query": {
"bool": {
"must": [
{
"regexp": {
"name": ".*云.*"
}
}
]
}
}
}
13、多层数据查询
GET /testes/_search
{
"query": {
"match": {
"fun.active": "进行中"
}
}
}
14、nested:嵌套数据类型,可以看成是一个特殊的对象类型,可以让对象数组独立检索
一个例子说明nested类型的作用
(1)Nested:嵌套对象是object数据类型的专用版本,能够对 对象数组进行彼此独立地索引和查询。
(2)对象数组默认组织形式
内部对象字段数组的实际存储机制与我们想的不一样。Lucene没有内部对象的概念,因为ElasticSearch将对象层次结构扁平化为一个字段名和字段值的列表。例如下面文档。
PUT user/_doc/1
{
"group" : "man",
"userName" : [
{
"first" : "张",
"last" : "三"
},
{
"first" : "李",
"last" : "四"
}
]
}
这里想要查询first为“张”,last为“四”的数据,按照我们的理解应该没有这种数据。按如下语句查询。
GET /user/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"userName.first":"张"
}
},
{
"match":{
"userName.last":"四"
}
}
]
}
}
}
查询结果如下:居然查询到了。这显然不符合我们的预期。
这个原因就是前面所说的lucene没有内部对象的概念,所谓的内部对象实际是被扁平化为一个简单的字段名称和值列表。文档内部存储是这个样子的:
{
"group" : "human",
"sex" : "man",
"userName.first" : [ "张", "李" ],
"userName.last" : [ "三", "四" ]
}
显然 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
}
}
]
}
}
}
}
]
}
}
}
这时是查不出来的,符合预期
这样就可以查询到了