2、ElasticSearch高级查询

这篇具有很好参考价值的文章主要介绍了2、ElasticSearch高级查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ES基础查询

1.1、数据准备

#PUT请求
http://127.0.0.1:9200/student
#插入文档, POST请求
http://127.0.0.1:9200/student/_doc/1001
{
 "age":19,
 "nickname":"zhanggang",
 "name":"张刚",
 "sex":"男"
}
http://127.0.0.1:9200/student/_doc/1002
{
 "age":19,
 "nickname":"zhangkun",
 "name":"张坤",
 "sex":"男"
}
http://127.0.0.1:9200/student/_doc/1003
{
 "age":18,
 "nickname":"xiaohong",
 "name":"小红",
 "sex":"女"
}
http://127.0.0.1:9200/student/_doc/1004
{
 "age":17,
 "nickname":"xiaolan",
 "name":"小蓝",
 "sex":"女"
}

1.2、查询所有文档

下面这种写法,有没有body体,都可以查询所有文档,建议写上body体。
body体中的"query" 代表的是一个查询对象,里面可以有不同的查询属性。 "match_all"表示查询类型,match_all代表查询所有。还有 match,term , range 等查询类型,可以参考下面写法。
#1、GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "query": {
	 "match_all": {}
	 } 
 }

1.3、匹配查询-match

match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系。
可以发现,下面查询会把name为张刚和张坤的两条数据查出来。如果请求body中的name改为"张刚刚",同样是可以查出张刚和张坤的两条数据。 因为文档里的数据分词后,都有带"张"的词,对请求的name分词后,同样是有张,所以可以匹配上。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
	"query": {
		"match": {
			"name":"张"
		}
	} 
}

1.4、匹配查询-multi_match

multi_match 与 match 类似,不同的是它可以在多个字段中查询。
比如下面的"张",它会在"name"和"nickname"字段分词查找。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
	"query": {
		"multi_match": {
			"query": "张",
			"fields": ["name","nickname"]
		}
	} 
}

1.5、关键字精确查询-term

term 查询,精确的关键词匹配查询,不对查询条件进行分词
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
	"query": {
		"term": {
			"nickname": {
				"value": "zhanggang"
			}
		}
	}
}

1.6、多关键字精确查询-terms

terms 查询和 term 查询一样,不同的是terms支持对多个值精确查询,注意是对多个值。类似musql的in。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
	"query": {
		"terms": {
			"nickname": ["zhanggang","zhangkun"]
		}
	} 
}

1.7、查询和过滤指定字段-includes和excludes

1、查询指定字段:ES在搜索的结果中默认把文档中保存在_source 的所有字段都返回。如果只想查询部分字段,可以添加_source 的过滤。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body,写法1,只查询name和nickname字段
{
	"_source": ["name","nickname"], 
	"query": {
		"terms": {
			"nickname": ["zhanggang"]
		}
	} 
}
#请求body,写法2,只查询name和nickname字段
{
	"_source": {
		"includes": ["name","nickname"]
	}, 
	"query": {
		"terms": {
			"nickname": ["zhanggang"]
		}
	}
}

2、过滤指定字段
includes:来指定想要显示的字段,(可以理解为默认为 includes,所以只配置显示那些字段时可省略)
excludes:来指定不想要显示的字段
#GET请求
http://127.0.0.1:9200/student/_search
#请求body,不查询name和nickname字段
{
	"_source": {
		"excludes": ["name","nickname"]
	}, 
	"query": {
		"terms": {
			"nickname": ["zhanggang"]
		}
	}
}

1.8、组合查询-pool

组合查询就是把match、multi_match、term、terms组合查询。
must:与关系,相当于关系型数据库中的 and。
should:或关系,相当于关系型数据库中的 or。
must_not:非关系,相当于关系型数据库中的 not。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "name":"张"
                    }
                }
            ],
            "must_not":[
                {
                    "match":{
                        "age":"27"
                    }
                }
            ],
            "should":[
                {
                    "match":{
                        "sex":"男"
                    }
                }
            ]
        }
    }
}

1.8、过滤(范围)查询-range

range 查询找出那些落在指定区间内的数字或者时间,和Mysql的比较符号是一样的。
比较符 说明
gt 大于
gte 大于等于
lt 小于
lte 小于等于
#GET请求,查询大于16小于27
http://127.0.0.1:9200/student/_search
#请求body,查询age大于16小于27
{
    "query":{
        "range":{
            "age":{
                "gt":16,
                "lt":27
            }
        }
    }
}

1.9、模糊查询

待定:后面讲

1.10、查询排序-order

ES可以按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc 升序。
注意:也可以按照_score进行排序,上面没讲_score是什么,实际它就是查询出来的一个评分,也就是表示对查询条件匹配程度,匹配条件越大,_score就越大。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "name":"张刚"
                    }
                }
            ]
        }
    },
	"sort":[   
        {
            "_score":{
                "order":"desc"
            }
        },
		{
            "age":{
                "order":"desc"
            }
        }
    ]

}

1.11、高亮查询-highlight

ES可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段

fields中的name也是一个json,也可以指定一些参数,不过一般都是默认不用管的,下面可以指定的参数:
fragment_size:设置要显示的文本长度,默认100
number_of_fragments:设置指定的文本片段个数
no_match_size:设置那些query没有匹配到的doc,你的高亮可以显示前缀多少个字符
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
    "query":{
        "match":{
            "name":"张刚"
        }
    },
    "highlight":{
        "pre_tags":"<font color='red'>",
        "post_tags":"</font>",
        "fields":{
            "name":{

            }
        }
    }
}

1.12、分页查询-from-size

分页查询需要加from和size参数:
from:当前页的起始索引,默认从 0 开始。
size:每页显示多少条。
from = (pageNum - 1) * size。
pageNum 表示第几页。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{
    "query":{
        "match_all":{
        }
    },
    "sort":[
        {
            "age":{
                "order":"desc"
            }
        }
    ],
    "from":0,
    "size":2
}

二、聚合查询

经过上面的学习,可以把ES的两种搜索模式:exact value-精确匹配(必须要支持分词)、exact value-精确匹配(不支持分词)。

2.1 聚合查询注意点-fielddata

1、在ES中,text类型的字段使用一种叫做fielddata的查询时内存数据结构,当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建。它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在java的堆内存中。
2、fileddata默认是不开启的。fielddata会消耗大量的堆内存空间,尤其是在加载大文本字段时。一旦fielddata已加载到堆中,它将在该段的生命周期内保留。加载fielddata很耗费性能的。
3、你只有打开某个字段的filedata,才可以对该字段进行聚合和排序,一般咱们对text类型的字段,不会用到聚合和排序的,ES本身也不推荐打开filedata。
4、注意:fileddata的概念,是对text类型来说的,其他类型没有fileddata概念。

2.2 聚合查询概念

聚合(aggs)不同于普通查询,是目前学到的第二种大的查询分类,第一种即“query”,因此在代码中的第一层嵌套由“query”变为了“aggs”。用于进行聚合的字段必须是exact value(精确匹配),分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(docvalues)变为了堆内存(fielddata),大数据的聚合操作很容易导致内存溢出。

聚合分类:
指标聚合(Metrics agregations):类似MYSQL中的函数,主要用于最大值、最小值、平均值、字段之和等指标的统计
桶聚合(Bucket agregations):类似MYSQL中的group by的作用,主要用于统计不同类型数据的数量
管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合

2.4 指标聚合

2.4.1 指标聚合body体说明

aggregation_name 为聚合返回结果的名称,由我们自己定义
agg_name 为聚合的参数,比如最大值(max)最小值(min),平均值(avg)等
field_name 表示根据某个字段聚合
missing 表示缺失值补充,比如当我们算age的平均值,有的文档没age字段,平均值就不包括该文档。如果加上missing,则表示,如果没age字段,则把age按指定的值处理算,这时平均值就包含该文档的了。一般情况下不写missing字段。
size:0表示是否返回聚合的源数据,加上表示不会返回,不加表示会返回,看个人需要是否添加。
#GET请求
#指标聚合body体
{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "agg_name": {
        "field": "field_name",
        "missing": 0
      }
    }
  }
}

2.4.2 求平均值-avg

#GET请求,求字段age的平均值
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "avg_balance_result": {
      "avg": {
        "field": "age"
      }
    }
  }
}

2.4.3 去重统计-cardinality

#GET请求,求字段age去重后的数量
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "age_count_result": {
      "cardinality": {
        "field": "age"
      }
    }
  }
}

2.4.4 聚合统计汇总-stats

实际上就是查询文档count数量,age最小值min,age最大值max,age平均值avg,age总数sum。
注意:把stats换成extended_stats,会得到方差,标准差等数据。
#get请求,求字段age的平均值
http://127.0.0.1:9200/student/_search
#请求体
{
  "size": 0,
  "aggs": {
    "age_stats_result": {
      "stats": {
        "field": "age"
      }
    }
  }
}
#返回数据
{
	"took": 3,
	"timed_out": false,
	"_shards": {
		"total": 1,
		"successful": 1,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
		"total": {
			"value": 4,
			"relation": "eq"
		},
		"max_score": null,
		"hits": []
	},
	"aggregations": {
		"age_stats_result": {
			"count": 3,
			"min": 18,
			"max": 19,
			"avg": 18.666666666666668,
			"sum": 56
		}
	}
}

2.4.5 同时查最大值和最小值-max-min

#get请求,求字段age的最大值和最小值
http://127.0.0.1:9200/student/_search
#请求体
{
  "size": 0,
  "aggs": {
    "max_age_result": {
      "max": {"field": "age"}
    },
    "min_age_result": {
      "min": {"field": "age"}
    }
  }
}

2.4.6 百分位统计-percentiles

2.4.7 百分位排名-percentiles

2.4.8 字符串统计聚合-string_stats

该功能主要是统计字符串从的最大长度,最小长度,平均长度等。
注意:该功能不属于对值的计算,所以text和keyword,都可以进行请求。
如果我们需要进行统计的字段如果是 text 字段,那么就需要加上 .keyword 来进行统计,如果是字段属性是 keyword,就不需要这样处理。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "name_stats_result": {
      "string_stats": {"field": "name.keyword"}
    }
  }
}

2.4.8 sum 统计总和–结合query

#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "query": {"match": {"name": "张"}}, 
  "aggs": {
    "age_sum_result": {
      "sum": {"field": "age"}
    }
  }
}

2.4.9 count 统计总数-value_count

#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "age_count_result": {
      "value_count": {
        "field": "age"
      }
    }
  }
}

2.5 桶聚合

2.4.1 桶聚合基本操作

对age做分组操作,size字段表示现在几组,比如age分了100组,下面20则表示,只显示20组。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "bucket_age": {
      "terms": {
        "field": "age",
        "size": 20
      }
    }
  }
}

2.4.2 过滤聚合-filter

如果我们想针对某特定的数据进行聚合,那么就涉及数据的过滤,筛选出特定的数据进行聚合。

比如我们想筛选出 name的值为 “张刚” 的数据,然后对其进行取平均数的操作,我们可以使用 filter 来如下操作。

注意:因为我们写入数据前,没有预先定义字段的类型,所以 es 中将其自动转化成 text 属性的字段,所以在查询的时候用到的是 name.keyword,意思是对 name字段的内容作为整体进行筛选。

如果name本身是 keyword 属性,就不用加 .keyword 来操作。

#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "bucket_gender_result": {
      "filter": {"term": {"name.keyword": "张刚"}},
      "aggs": {
        "avg_age_result": {"avg": {"field": "age"}}
      }
    }
  }
}

2.4.3 多桶过滤聚合-filter

在上一点(2.4.2)我们过滤的是单个条件,name='张刚' 的情况,如果我们想要实现多个过滤来操作,可以使用 filters,使用方法也不一样。
如下:得到的是name为"张刚"和"张坤的数据条数"
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "bucket_gender": {
      "filters": {
        "filters": {
          "female": {"term": {"name.keyword": "张刚"}},
          "male": {"term": {"name.keyword": "张坤"}}
        }
      }
    }
  }
}
如果想在此基础上接着对其进行均值计算,和前面的 filter 操作一样,在第一个 filters 同级的地方,加上我们的指标聚合操作:
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "bucket_gender": {
      "filters": {
        "filters": {
          "g_result": {"term": {"name.keyword": "张刚"}},
          "k_result": {"term": {"name.keyword": "张坤"}}
        }
      },
      "aggs": {
        "avg_balance": {"avg": {"field": "age"}}
      }
    }
  }
}

2.4.4 多桶过滤聚合2-filter-other_bucket_key

和2.4.3相比,如果获取name为张刚和张坤外的的平均age的值,只需要加个other_bucket_key就可以实现,如下:
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "bucket_gender": {
      "filters": {
         "other_bucket_key": "non_gender_result", 
        "filters": {
          "g_result": {"term": {"name.keyword": "张刚"}},
          "k_result": {"term": {"name.keyword": "张坤"}}
        }
      },
      "aggs": {
        "avg_balance": {"avg": {"field": "age"}}
      }
    }
  }
}

2.4.5 全局聚合

如果我们要在限定的范围内进行聚合,但是又想在全局范围内获取聚合数据进行比对。 比如说,我们在 name='张刚' 的范围进行聚合操作。
注意:下面求平均值,用前面的写法,也能查出来,之所以这么写,这个是可以扩展的,比如在aggs中在加不同的桶聚合呢,加filter即可。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0, 
  "query": {"match": {"name.keyword": "张刚"}},
  "aggs": {
    "female_balance_avg": {
      "avg": {
        "field": "age"
      }
    }
  }
}
这里通过 query 操作筛选 name='张刚' 的数据,然后对 age字段进行聚合,如果同时我们想要获取所有数据的 age的平均值,我们可以使用 global 来操作。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0, 
  "query": {"match": {"name.keyword": "张刚"}},
  "aggs": {
    "total_balance_avg_result": {
      "global": {},
      "aggs": {
        "avg_balance_result": {
          "avg": {"field": "age"}
        }
      }
    },
    "female_balance_avg_result": {
      "avg": {
        "field": "age"
      }
    }
  }
}

2.4.6 直方图聚合-histogram

这是个类似于直方图的区间桶的聚合操作。
比如对于 age 字段,我们想以 5 为步长进行聚合,如果 age 字段在 20-50 之间,那么返回的数据就会类似于 20-24,25-29,30-34... 以及落在这些区间的数据的数量。
而返回的每条数据并不会是一个区间,而是一个开始的数据,也就是说上面的例子会返回的 key 是 20,25,30 等。
如果我们进行聚合的区间,比如说 25-29 之间聚合的数据是 0,那么 es 还是会返回这个区间,不过 doc_count 是 0,不会存在不返回这个区间 key 的情况。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{
  "size": 0,
  "aggs": {
    "age_histogram_result": {
      "histogram": {
        "field": "age",
        "interval": 5
      }
    }
  }
}

https://mp.weixin.qq.com/s?__biz=Mzg5ODczMTA0Mw==&mid=2247485299&idx=1&sn=db05433c817b85dd31b65f6d06ac4f47&chksm=c05f5a3ff728d3296ad0ed48495ee65b3f37d2f417a66c5f482a8190faf2278a0b5b4b10d51d&cur_album_id=2701256983458676736&scene=189#wechat_redirect文章来源地址https://www.toymoban.com/news/detail-591496.html

到了这里,关于2、ElasticSearch高级查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 七、ElasticSearch-高级查询操作三

    在进行搜索时,搜索出的内容中的会显示不同的颜色,称之为高亮。 Elasticsearch 可以对查询内容中的部分,进行标签和样式 ( 高亮 ) 的设置。 在使用 match 查询的同时,加上一个 highlight 属性: pre_tags :前置标签 post_tags :后置标签 fields :需要高亮的字段

    2023年04月08日
    浏览(31)
  • 【ElasticSearch系列-03】ElasticSearch的高级句法查询Query DSL

    ElasticSearch系列整体栏目 内容 链接地址 【一】ElasticSearch下载和安装 https://zhenghuisheng.blog.csdn.net/article/details/129260827 【二】ElasticSearch概念和基本操作 https://blog.csdn.net/zhenghuishengq/article/details/134121631 【二】ElasticSearch的高级查询Query DSL https://blog.csdn.net/zhenghuishengq/article/details/1

    2024年02月06日
    浏览(55)
  • 实战中关于elasticsearch中的查询方法--高级查询

    因为最近要从elasticsearch中获取数据给前端展示,然后自己摸索到了一些查询方法,记录一下,以防忘记 只展示业务层的代码逻辑: 搜索条件方法: 分页和排序的方法: 这就是普通的查询办法。  例如要对整个elastcsearch中的数据进行统计分组和巧合的时候,上述的方法就不

    2023年04月08日
    浏览(46)
  • ElasticSearch(三)高级查询语法(DLS)

            1、单词词典:记录所有文档单词,单词到倒排列表的关系;         2、倒排列表:记录了单词对应的文档id;         3、倒排索引项:a 文档id b 词频 c 位置(单词在文本中的位置)d 偏移:单词开始结束位置; mapping映射类似于数据库的字段类型 put /索引名 {   

    2024年01月21日
    浏览(38)
  • elasticsearch(es)高级查询api

    在以上示例代码中,定义了一个返回类型为ResponseEntityMapString, Object的/search POST映射方法,并使用MapString, Object对象来存储异步操作的结果。然后,创建了一个ActionListener的匿名实现对象,并使用client.searchAsync()方法以异步方式执行搜索操作。在onResponse()方法中,将搜索结果存储

    2023年04月09日
    浏览(41)
  • Elasticsearch的高级查询技巧与优化

    Elasticsearch是一个基于分布式搜索和分析引擎,它可以提供实时、高性能、可扩展的搜索功能。在大数据时代,Elasticsearch在各种应用场景中发挥着重要作用。本文将深入探讨Elasticsearch的高级查询技巧与优化,帮助读者更好地掌握Elasticsearch的高级查询技能。 在深入探讨Elastic

    2024年03月19日
    浏览(52)
  • Elasticsearch入门之Http操作(高级查询)

    Http操作: 高级查询: 高级查询:Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询 初始化数据: 查询所有文档: 在 Postman 中,向 ES 服务器发 GET 请求 :http://172.18.20.254:9200/shopping/_search 返回值: 返回值解释: 匹配查询: match 匹配类型查询,会把查询条件进行分词

    2024年02月02日
    浏览(41)
  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(80)
  • Elasticsearch7.8.0版本入门—— 高亮查询文档(高级查询)

    在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/ 1 ,请求体内容为: 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/ 2 ,请求体内容为: 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/ 3 ,请求体内容为: 在 Postman 中,向

    2024年02月01日
    浏览(59)
  • ElasticSearch 高级查询语法Query DSL实战

    ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified Language 领域专用语言) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 官方文档:https://www.elastic.co/guide/en/elasti

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包