相關性評分排序
默認情況下,返回的結果是按照 相關性 進行排序的——最相關的文檔排在最前。 首先看看 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 " } } } } } } }