原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-filters.html
elasticsearch版本:6.5
目录地址:https://blog.youkuaiyun.com/mine_1/article/details/85623429
目录
1、filters操作
在上一节中,我们跳过了一个称为score(搜索结果中的_score字段)的小细节。score是一个数值,它是文档与我们指定的搜索查询匹配程度的相对度量。得分越高,文件越相关,得分越低,文件越不相关。
但是查询并不总是需要生成分数,特别是当它们只用于filtering文档集时。ElasticSearch检测到这些情况,并自动优化查询执行,以避免计算无用的分数。
我们在前一节中介绍的bool查询还支持筛选子句,它允许我们使用查询来限制将由其他子句匹配的文档,而不更改计算分数的方式。作为一个例子,让我们介绍range查询,它允许我们按一系列值筛选文档。这通常用于筛选数字或日期。
此示例使用bool查询返回balances在20000和30000之间(包括20000和30000)的所有帐户。换句话说,我们希望找到balances大于或等于20000且小于或等于30000的账户。
GET /bank/_search
{
"query":{
"bool":{
"must":{"match_all":{}},
"filter:{
"range":{
"balance":{
"gte":20000,
"lte":30000
}
}
}
}
}
}
仔细分析以上内容,bool查询包含一个match-all查询(query部分)和一个range查询(filter部分)。我们可以将任何其他查询替换为query和filter部分。在上述情况下,range范围内的文档相当于匹配,即没有文档比范围内的文档更相关。
除了matchou all、match、bool和range之外,还有许多其他可用的查询类型,我们在这里不讨论它们。因为我们已经对它们的工作方式有了基本的了解,所以在学习和试验其他查询类型时应用这些知识应该不会太困难。
2、聚合操作
aggregations提供了从数据中分组和提取统计信息的能力。考虑聚合最简单的方法是将其等同于SQL的group by 和SQL的聚合函数。在elasticsearch中,您可以同时执行查询和聚合的结果。从某种意义上说,这是非常强大和高效的,您可以运行查询和多个聚合,并一次性获得两个或多个操作的结果,避免使用频繁的网络请求。
首先,下面的例子是对所有账户按照state进行分组,然后返回按计数降序排序的前10个结果:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
相当于sql中的:
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC LIMIT 10;
响应的结果为:
{
"took": 29,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped" : 0,
"failed": 0
},
"hits" : {
"total" : 1000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound": 20,
"sum_other_doc_count": 770,
"buckets" : [ {
"key" : "ID",
"doc_count" : 27
}, {
"key" : "TX",
"doc_count" : 27
}, {
"key" : "AL",
"doc_count" : 25
}, {
"key" : "MD",
"doc_count" : 25
}, {
"key" : "TN",
"doc_count" : 23
}, {
"key" : "MA",
"doc_count" : 21
}, {
"key" : "NC",
"doc_count" : 21
}, {
"key" : "ND",
"doc_count" : 21
}, {
"key" : "ME",
"doc_count" : 20
}, {
"key" : "MO",
"doc_count" : 20
} ]
}
}
}
我们可以看到,ID(爱达荷州)有27个账户,德克萨斯州有27个账户,阿拉巴马州有25个账户,以此类推。
请注意,我们将size=0设置为不显示搜索结果,因为我们只希望在响应中看到聚合结果。
基于上一个聚合,此示例按state计算平均帐户balance(同样,仅针对按计数降序排序的前10个状态):
GET /bank/_search
{
"size":0,
"aggs":{
"group_by_state":{
"terms":{
"fields":"state.keyword"
},
"aggs":{
"average_balanece":{
"avg":{
"field":"balance"
}
}
}
}
}
}
请注意,我们如何将average_balance聚合嵌套在group_by_state内。这是所有聚合的通用模式。可以在聚合中任意嵌套聚合,以从数据中提取所需的统计信息。
基于上面的聚合,我们按照average_balance进行降序排序:
GET /bank/_search
{
"size":0,
"aggs":{
"group_by_state":{
"terms":{
"field":"state.keyword",
"order":{
"average_balance":"desc"
}
},
"aggs":{
"average_balance":{
"avg":{
"field":"balance"
}
}
}
}
}
}
下面的例子演示了我们如何按age(20-29岁、30-39岁和40-49岁)分组,然后按gender分组,最后得到每个年龄段每个性别的平均帐户余额:
GET /bank/_search
{
"size":0,
"aggs":{
"group_by_age":{
"range":{
"field":"age",
"ranges":[
{
"from":20,
"to":30
},
{
"from":30,
"to":40
},
{
"from":40,
"to":50
}
]
},
"aggs":{
"group_by_gender":{
"terms":{
"field":"gender.keyword"
},
"aggs":{
"average_balance":{
"avg":{
"field":"balance"
}
}
}
}
}
}
}
}
还有很多聚合功能没有介绍,详见聚合参考文档了解更多内容。