Elasticsearch(七)資訊檢索與結果過濾
Elasticsearch: 6.4.2
聚合分類:
Bucketing聚合: 類似SQL中的GROUP BY;基於檢索構成了邏輯文件組,滿足特定規則的文件放置到一個桶裡,每一個桶關聯一個key; 分桶聚合可以巢狀分桶聚合。
Metric聚合: 基於一組文件進行聚合。所有的文件在一個檢索集合裡,文件被分成邏輯的分組; 對一個數據集求最大、最小、和、平均值等指標的聚合。
Matrix聚合: 此功能是實驗性的,可在將來的版本中完全更改或刪除;在多個欄位上操作,並根據從請求的文件中提取的值生成矩陣結果。
Pipeline聚合:對聚合的結果而不是原始資料集進行操作。
測試資料
POST userinfo/ doc/_bulk
{
"index": {
"_id": "1"
}
}
{
"username": "alfred way",
"job": "java engineer",
"age": 18,
"birth": "1990-01-02",
"isMarried": false,
"salary": 10000
}
{
"index": {
"_id": "2"
}
}
{
"username": "tom",
"job": "java senior engineer",
"age": 28,
"birth": "1980-05-07",
"isMarried": true,
"salary": 30000
}
{
"index": {
"_id": "3"
}
}
{
"username": "lee",
"job": "ruby engineer",
"age": 22,
"birth": "1985-08-07",
"isMarried": false,
"salary": 15000
}
{
"index": {
"_id": "4"
}
}
{
"username": "Nick",
"job": "web engineer",
"age": 23,
"birth" : "1989-08-07",
"isMarried": false,
"salary": 8000
}
{
"index": {
"_id": "5"
}
}
{
"username": "Niko",
"job": "web engineer",
"age": 18,
"birth": "1994-08-07",
"isMarried": false,
"salary": 5000
}
{
"index": {
"_id": "6"
}
}
{
"username": "Michell",
"job": "ruby engineer",
"age": 26,
"birth": "1987-08-07",
"isMarried": false,
"salary": 12000
}
-
Metric聚合
最值、求和、均值
POST /userinfo/doc/_search { "size": 0, "aggs": { "avg_grade": { "avg": { # 可以使用max、min、sum "field": "salary" } } } }
Cardinality
類似於SQL中的district count
POST /userinfo/doc/_search { "size": 0, "aggs": { "type_count": { "cardinality": { "field": "job.keyword" } } } }
Stats
返回一系列數值型別的統計值,包括min,max,avg,sum,count。
POST /userinfo/doc/_search { "size":0, "aggs":{ "stats_age":{ "stats":{ "field":"age" } } } }
Extended Stats
對
Stats
聚合的擴充套件,包含更多統計資料,例如:方差,標準差等。POST /userinfo/doc/_search { "size":0, "aggs":{ "stats_age":{ "extended_stats":{ "field":"age" } } } }
Percentiles
# 百分位數統計 POST /userinfo/doc/_search { "size":0, "aggs":{ "per_age":{ "percentiles":{ "field":"salary" } } } } # 針對特定值計算百分位數 POST /userinfo/doc/_search { "size":0, "aggs":{ "per_age":{ "percentile_ranks":{ "field":"salary", "values":[ 11000, 30000 ] } } } } # 針對特定百分位數計算對應的值 POST /userinfo/doc/_search { "size":0, "aggs":{ "per_age":{ "percentiles":{ "field":"salary", "percents" : [80, 95, 99, 99.9] } } } }
Top Hits
一般用於分桶後獲取該桶內最匹配的頂部文件詳情資料
# 先根據job分桶,後在桶內根據age排序 POST /userinfo/doc/_search { "size":0, "aggs":{ "jobs":{ "terms":{ "field":"job.keyword", "size":10 }, "aggs":{ "top_employee":{ "top_hits":{ "size":10, "sort":[ { "age":{ "order":"desc" } } ] } } } } } }
-
Bucketing聚合
Terms
改分桶策略最簡單,直接根據term分桶,如果是text型別,則按照分析器處理後的結果分桶。
POST /userinfo/doc/_search { "size":0, "aggs":{ "jobs":{ "terms":{ "field":"job.keyword", "size":10 } } } }
Range
通過指定數值的範圍來設定分桶規則
POST /userinfo/doc/_search { "size":0, "aggs":{ "salary_range":{ "range":{ "field":"salary", "ranges":[ { "to":10000 }, { "from":10000, "to":20000 }, { "from":20000 } ] } } } }
Date Range
通過指定日期的範圍來設定分桶規則
POST /userinfo/doc/_search { "size":0, "aggs":{ "date_range":{ "range":{ "field":"birth", "format":"yyyy", "ranges":[ { "from":"1980", "to":"1990" }, { "from":"1990", "to":"2000" }, { "from":"2000" } ] } } } }
Historgram
以固定間隔來分割資料
POST /userinfo/doc/_search { "size":0, "aggs":{ "salary_hist":{ "histogram":{ "field":"salary", "interval":5000, "extended_bounds":{ "min":0, "max":40000 } } } } }
Date Historgram
針對日期的直方圖
POST /userinfo/doc/_search { "size":0, "aggs":{ "salary_hist":{ "date_histogram":{ "field":"birth", "interval":"year", "format":"yyyy" } } } }
Filter
將滿足過濾條件的文件放入桶中
POST /userinfo/doc/_search { "size": 0, "aggs": { "salary_aggs": { "filter": { "range": { "salary": { "gte": 10000 } } }, "aggs": { "avg_salary": { "avg": { "field": "salary" } } } } } }
Missing
統計缺少指定欄位的文件個數。
POST /userinfo/doc/_search { "size": 0, "aggs": { "miss_aggs": { "missing": { "field": "phone" } } } }
-
Pipeline聚合
針對聚合分析的結果再次進行聚合分析,而且支援鏈式呼叫。
Pipeline的分析結果會輸出到原結果中,根據輸出位置的不同,分為以下兩類:
- Parent結果內嵌到現有的聚合分析結果中
-
Derivative
-
Moving Average
-
Cumulative Sum
- Sibling結果與現有聚合分析結果同級
-
Max/Min/Avg/Sum Bucket
-
Stats/Extended Stats Bucket
-
Percentitles Bucket
Sibing-Derivative
先根據job分桶並計算各個分桶的avg值,然後輸出avg最小的桶名稱和值
POST /userinfo/doc/_search { "size":0, "aggs":{ "jobs":{ "terms":{ "field":"job.keyword", "size":10 }, "aggs":{ "avg_salary":{ "avg":{ "field":"salary" } } } }, "min_salary_by_job":{ "min_bucket":{ "buckets_path":"jobs>avg_salary" } } } }
先根據job分桶並計算各個分桶的avg值,然後對所有bucket進行stats分析
POST /userinfo/doc/_search { "size":0, "aggs":{ "jobs":{ "terms":{ "field":"job.keyword", "size":10 }, "aggs":{ "avg_salary":{ "avg":{ "field":"salary" } } } }, "stats_salary_by_job":{ "stats_bucket":{ "buckets_path":"jobs>avg_salary" } } } }
Parent-Derivative
計算bucket的導數
POST /userinfo/doc/_search { "size":0, "aggs":{ "birth":{ "date_histogram":{ "field":"birth", "interval":"year", "min_doc_count":0 }, "aggs":{ "avg_salary":{ "avg":{ "field":"salary" } }, "derivative_avg_salary":{ "derivative":{ "buckets_path":"avg_salary" } } } } } }
-
Bucket+Metric聚合分析
先根據job進行term分桶策略,然後再對每一個分桶進行range分桶策略
POST /userinfo/doc/_search { "size":0, "aggs":{ "jobs":{ "terms":{ "field":"job.keyword", "size":10 }, "aggs":{ "age_range":{ "range":{ "field":"age", "ranges":[ {"to":20}, {"from":20,"to":30}, {"from":30} ] } } } } } }
-
搜尋提示
_suggest
URI已經被_search
所替代,使用suggest
屬性。POST /userinfo/doc/_search { "query": { "match": { "job": "web" } }, "suggest": { "me_SUGGESTION": { "text": "web", "term": { "field": "job" } } } }