ElasticSearch基本使用姿勢二

小灰灰Blog發表於2022-06-15
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 聚合詳解

Elasticsearch 聚合分析深入學習

Elasticsearch: 權威指南-聚合

一灰灰的聯絡方式

盡信書則不如無書,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

QrCode

相關文章