es查询-排序、分页、聚合
相关性评分排序
默认情况下,返回的结果是按照 相关性 进行排序的——最相关的文档排在最前。 首先看看 sort 参数以及如何使用它。
为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序,按照相关性评分升序排序如下
# query_string 查询
POST /book/_search -- query_string 默认所有
{
"query":{
"query_string":{
"default_field":"desri",
"query":"nosql"
}
}
}
# 返回指定字段
POST /book/_search { "query": { "match": {"description":"solr"} },
"_source":["name","date"] }
POST /book/_search
{
"query": {
"match": {"description":"solr"}
},
"_source":{
"include":["location.*","date"],
"exclude":["location.geolocation"]
}
}
POST /book/_search { "query": { "match": {"description":"solr"} } }
{
"query": {
"match": {"description":"solr flink", "operator":"and"} # 使用and而不是默认的or
}
}
# phrase 查询 和 phrase_prefix 查询
{
"query": {
"match": {
"name":{
"type":"phrase", # enterprise 和london之间有一个词语
"query":"enterprise london",
"slop":1
}
}
}
}
# phrase_prefix 和词组中最后一个词条进行前缀匹配
{
"query": {
"match": {
"name":{
"type":"phrase_prefix", # enterprise 和london之间有一个词语
"query":"enterprise lon",
"max_expansions":1
}
}
}
}
POST /book/_search { "query": { "match": {"description":"solr"} }, "sort": [ {"_score": {"order": "asc"}} ]
POST /book/_search
{
"query":{
"match_all":{}
},
"sort": [
{ "price": { "order": "desc" }},
{ "timestamp": { "order": "desc" }}
]
}
分页
Elasticsearch中实现分页的语法非常简单
size:每页显示多少条
from:当前页起始索引, int start = (pageNum - 1) * size
POST /book/_search { "query": { "match_all": {} }, "sort": [ {"price": {"order": "desc"}} ], "size": 2, "from": 0 } POST /book/_search { "query": { "match_all": {} }, "sort": [ {"price": {"order": "desc"}} ], "size": 2, "from": 2 }
聚合
聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。Elasticsearch作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。
对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合 metric 而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶,桶聚合bucketing
# 查询所有书中最贵的 POST /book/_search { "size": 0, "aggs": { "max_price": { "max": { "field": "price" } } } # 示例: 统计price大于100的文档数量 POST /book/_count { "query": { "range": { "price" : { "gt":100 } } } } #统计条数(value_count统计某个字段有值的数量) POST /book/_search { "size": 0, "aggs": { "book_nums": { "value_count": { "field": "_id" } } } } # value_count 统计某字段有值的文档数 POST /book/_search?size=0 { "aggs": { "price_count": { "value_count": { "field": "price" } } } } # cardinality值去重计数 基数 POST /book/_search?size=0 { "aggs": { "_id_count": { "cardinality": { "field": "_id" } }, "price_count": { "cardinality": { "field": "price" } } } } ## stats 统计 count max min avg sum 5个值 POST /book/_search?size=0 { "aggs": { "price_stats": { "stats": { "field": "price" } } } }
Extended stats
高级统计,比stats多4个统计结果: 平方和、方差、标准差、平均值加/减两个标准差的区间
POST /book/_search?size=0 { "aggs": { "price_stats": { "extended_stats": { "field": "price" } } }
Percentiles 占比百分位对应的值统计
POST /book/_search?size=0 { "aggs": { "price_percents": { "percentiles": { "field": "price" } } } }
指定分位值
POST /book/_search?size=0 { "aggs": { "price_percents": { "percentiles": { "field": "price", "percents" : [75, 99, 99.9] } } } }
Percentiles rank 统计值小于等于指定值的文档占比
统计price小于100和200的文档的占比
POST /book/_search?size=0 { "aggs": { "gge_perc_rank": { "percentile_ranks": { "field": "price", "values": [ 100,200 ] } } } }
桶聚合
它执行的是对文档分组的操作(与sql中的group by类似),把满足相关特性的文档分到一个桶里,即桶分,输出结果往往是一个个包含多个文档的桶(一个桶就是一个group)
bucket:一个数据分组
metric:对一个数据分组执行的统计
POST /book/_search { "size": 0, "aggs": { "group_by_price": { "range": { "field": "price", "ranges": [ { "from": 0, "to": 200 }, { "from": 200, "to": 400 }, { "from": 400, "to": 1000 } ] }, "aggs": { "average_price": { "avg": { "field": "price" } } } } } }
值的个数统计
"count_price": { "value_count": { "field": "price" } }
实现having 效果
POST /book/_search { "size": 0, "aggs": { "group_by_price": { "range": { "field": "price", "ranges": [ { "from": 0, "to": 200 }, { "from": 200, "to": 400 }, { "from": 400, "to": 1000 } ] }, "aggs": { "average_price": { "avg": { "field": "price" } }, "having": { "bucket_selector": { "buckets_path": { "avg_price": "average_price" }, "script": { "source": "params.avg_price >= 200 " } } } } } } }