6、探索你的数据(2)

原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-filters.html

elasticsearch版本:6.5

目录地址:https://blog.csdn.net/mine_1/article/details/85623429

目录

1、filters操作

2、聚合操作


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"
                         }
                     }
                    }
                 }
             }
        }
    }
}

还有很多聚合功能没有介绍,详见聚合参考文档了解更多内容。

猜你喜欢

转载自blog.csdn.net/mine_1/article/details/85680012