es查詢-排序、分頁、聚合


相關性評分排序
默認情況下,返回的結果是按照 相關性 進行排序的——最相關的文檔排在最前。 首先看看 sort 參數以及如何使用它。
為了按照相關性來排序,需要將相關性表示為一個數值。在 Elasticsearch 中, 相關性得分 由一個浮點數進行表示,並在搜索結果中通過 _score 參數返回, 默認排序是 _score 降序,按照相關性評分升序排序如下

POST /book/_search
{
"query": {
"match": {"description":"solr"}
}
}



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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM