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

 

posted @ 2021-12-01 23:20  Wind_LPH  阅读(4524)  评论(0编辑  收藏  举报