ElasticSearch基本使用姿勢二
本文作為elasticsearch 基本使用姿勢第二篇,包含以下內容
- 查詢指定欄位
- 限制返回條數
- 分頁查詢
- 分組查詢
- 高亮
- 自動補全提示
- 排序
- 返回結果聚合,如統計文件數,某個field value的求和、平均值等
更多相關知識點請檢視: * ElasticSearch 基本使用姿勢 - 一灰灰Blog
<!-- more -->
0. 資料準備
初始化一個索引,寫入一些測試資料
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:08",
"url": "/test",
"execute": {
"args": "id=10&age=20",
"cost": 10,
"res": "test result"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/test",
"execute": {
"args": "id=20&age=20",
"cost": 11,
"res": "test result2"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:10",
"url": "/test",
"execute": {
"args": "id=10&age=20",
"cost": 12,
"res": "test result2"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/hello",
"execute": {
"args": "tip=welcome",
"cost": 2,
"res": "welcome"
},
"response_code": 200,
"app": "yhh_demo"
}
post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/404",
"execute": {
"args": "tip=welcome",
"cost": 2,
"res": "xxxxxxxx"
},
"response_code": 404,
"app": "yhh_demo"
}
1. 查詢指定欄位
比如我現在只關心url返回的狀態碼, 主要藉助_source
來指定需要查詢的欄位,查詢的語法和之前介紹的一致
GET second-index/_search
{
"_source": [
"url",
"response_code"
],
"query": {
"match_all": {}
}
}
2. 返回條數限制
針對返回結果條數進行限制,屬於比較常見的case了,在es中,直接通過size
來指定
GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 2
}
3. 分頁查詢
通過size限制返回的文件數,通過from來實現分頁
GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 1,
"from": 1
}
(注意下面輸出截圖,與上面的對比,這裡返回的是第二條資料)
4. 分組查詢
相當於sql中的group by
,常用於聚合操作中的統計計數的場景
在es中,使用aggs
來實現,語法如下
"aggs": {
"agg-name": { // 這個agg-name 是自定義的聚合名稱
"terms": { // 這個terms表示聚合的策略,根據 field進行分組
"field": "",
"size": 10
}
}
}
比如我們希望根據url統計訪問計數,對應的查詢可以是
GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url",
"size": 2
}
}
}
}
但是在執行時,會發現並不能正常響應
右邊返回的提示資訊為Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [url] in order to load field data by uninverting the inverted index. Note that this can use significant memory
這個異常
簡單來說,就是url這個欄位為text型別,預設情況下這種型別的不走索引,不支援聚合排序,如果需要則需要設定fielddata=true
,或者使用url的分詞url.keyword
GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url.keyword",
"size": 2
}
}
}
}
注意
- 雖然我們更注重的是分組後的結果,但是
hits
中依然會返回命中的文件,若是隻想要分組後的統計結果,可以在查詢條件中新增size:0
- 聚合操作和查詢條件是可以組合的,如只查詢某個url對應的計數
GET second-index/_search
{
"query": {
"term": {
"url.keyword": {
"value": "/test"
}
}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url.keyword",
"size": 2
}
}
}
}
上面介紹了TEXT型別的field,根據分詞進行聚合操作;還有一種方式就是設定fielddata=true
,操作姿勢如下
PUT second-index/_mapping
{
"properties": {
"url": {
"type": "text",
"fielddata": true
}
}
}
修改完畢之後,再根據url進行分組查詢,就不會拋異常了
5. 全文搜尋
通過配置一個動態索引模板,將所有的field構建一個用於全文檢索的field,從而實現全文搜尋
6. 聚合操作
上面的分組也算是聚合操作中的一種,接下來仔細看一下es的聚合,可以支援哪些東西
聚合語法:
"aggs": {
"agg_name": { // 自定義聚合名
"agg_type": { // agg_type聚合型別, 如 min, max
"agg_body" // 要操作的計算值
},
"meta": {},
"aggregations": {} // 子聚合查詢
}
}
從聚合分類來看,可以劃分為下面幾種
- Metric Aggregation: 指標分析聚合
- Bucket Aggregation: 分桶聚合
- Pipeline: 管道分析型別
- Matrix: 矩陣分析型別
5.1 Metric Aggregation: 指標分析聚合
常見的有 min, max, avg, sum, cardinality, value count
通常是值查詢一些需要通過計算獲取到的值
下面分別給出一些演示說明
5.1.1 min最小值
獲取請求耗時最小的case
GET second-index/_search
{
"size": 0,
"aggs": {
"min_cost": {
"min": {
"field": "execute.cost"
}
}
}
}
- size: 0 表示不需要返回原資料
- min_cost: 自定義的聚合名
- min: 表示聚合型別,為取最小值
"field": "execute.cost"
: 表示取的是Field: execute.cost
的最小值
5.1.2 max 最大值
基本同上,下面中貼出請求程式碼,截圖就省略掉了
GET second-index/_search
{
"size": 0,
"aggs": {
"max_cost": {
"max": {
"field": "execute.cost"
}
}
}
}
5.1.3 sum 求和
GET second-index/_search
{
"size": 0,
"aggs": {
"sum_cost": {
"sum": {
"field": "execute.cost"
}
}
}
}
5.1.4 avg平均值
在監控平均耗時的統計中,這個還是比較能體現服務的整體效能的
GET second-index/_search
{
"size": 0,
"aggs": {
"avg_cost": {
"avg": {
"field": "execute.cost"
}
}
}
}
5.1.5 cardinality 去重統計計數
這個等同於我們常見的 distinct count
注意與後面的 value count
統計所有有值的文件數量之間的區別
GET second-index/_search
{
"_source": "url",
"aggs": {
"cardinality_cost": {
"cardinality": {
"field": "url"
}
}
}
}
去重統計url的計數,如下圖,可以看到返回統計結果為3,但是實際的文件數有5個
5.1.6 value count 計數統計
文件數量統計,區別於上面的去重統計,這裡返回的是全量
GET second-index/_search
{
"size": 0,
"aggs": {
"count_cost": {
"value_count": {
"field": "url"
}
}
}
}
輸出結果配合cardinality的返回,做一個對比可以加強理解
5.1.7 stats 多值計算
一個stats 可以返回上面min,max,sum...
等的計算值
GET second-index/_search
{
"size": 0,
"aggs": {
"mult_cost": {
"stats": {
"field": "execute.cost"
}
}
}
}
5.1.8 extended_stats 多值擴充套件
在上面stats的基礎上進行擴充套件,支援方差,標準差等返回
GET second-index/_search
{
"size": 0,
"aggs": {
"mult_cost": {
"extended_stats": {
"field": "execute.cost"
}
}
}
}
5.1.9 percentile 百分位數統計
用於統計 xx% 的記錄值,小於等於右邊
如下面截圖,可知 99%的記錄,耗時小於12
預設的百分比區間是: [1, 45, 25, 50, 75, 95, 99]
, 可以手動修改
GET second-index/_search
{
"size": 0,
"aggs": {
"agg_cost": {
"percentiles": {
"field": "execute.cost",
"percents": [
10,
50,
90,
99
]
}
}
}
}
5.1.10 percentile rank統計值所在的區間
上面用於統計不同區間的佔比,比如公司的人員年齡分佈;而這一個則是我想知道18歲的我,在哪個佔比裡
GET second-index/_search
{
"size": 0,
"aggs": {
"agg_cost": {
"percentile_ranks": {
"field": "execute.cost",
"values": [6, 9]
}
}
}
}
相關博文
ElasticSearch:aggregations 聚合詳解
一灰灰的聯絡方式
盡信書則不如無書,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 個人站點:https://blog.hhui.top
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
- 微信公眾號:一灰灰blog