ElasticSearch基本使用姿勢二

ElasticSearch基本使用姿勢二

本文作爲elasticsearch 基本使用姿勢第二篇,包含以下內容

  • 查詢指定字段
  • 限制返回條數
  • 分頁查詢
  • 分組查詢
  • 高亮
  • 自動補全提示
  • 排序
  • 返回結果聚合,如統計文檔數,某個field value的求和、平均值等

更多相關知識點請查看: * ElasticSearch 基本使用姿勢 - 一灰灰Blog

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章