前言
這篇文章是出自於線上課程 Complete Guide to Elasticsearch 的所記錄的筆記。
這篇文章使用的 ES 版本為 7.16.2
這一篇文章要來介紹如何讓 Elastic 回傳 不同格式 或是 特定內容 的資料
正文
要讓 Elastic 回傳不同的格式,可以在 query 的條件後方加上 ?format=<format>
,支援的格式可以從這裡查詢。此外,也可以使用 ?pretty
的方式,讓輸出的格式是易讀的。
E.g.
1 2 3 4 5 6 7 8 9 10 11
| # YAML format response GET /<index>/_search?format=yaml { ... }
# Read-friendly response GET /<index>/_search?pretty { ... }
|
過濾 source (Source filtering)
透過 source 所指定的內容來得到特定的欄位資料。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| # 省略 source GET /_search { "_source": false, ... }
# 指定特定欄位的方式有很多 ## 拿取 obj 下的任何任何欄位 (wildcard) GET /_search { "_source": obj.*, ... }
## 拿取 ingredient 底下的 name GET /_search { "_source": ingredient.name, ... }
## 指定多個欄位 GET /_search { "_source": ["ingredients", "servings"], ... }
## 排除特定欄位 - 拿取 ingredient 的所有拿位,除了 `name` GET /_search { "_source": { "includes": "ingredients.*", "excludes": "ingredients.name"], ... }
|
指定回傳資料數量 (Result size)
透過指定 size 的方式來改變資料回傳的數量。
size 預設數量為 10
1 2 3 4 5 6 7 8 9 10 11 12
| # Size 可以指定在 query GET /_search?size=<size> { ... }
# 也可以指定在 data 裡 GET /_search { "size": <size> ... }
|
從第幾筆資料開始取得 - Offset
透過設定 offset
,可以指定要從第幾筆資料開始拿,預設都是從第 0 筆開始拿。
1 2 3 4 5 6 7
| # 拿取第3、4 筆資料 GET /_search { "offset": 2, "size": 2, ... }
|
頁數的計算方式 page = total_hits / size
指定 offset, size 的數值,預設都不能超過 10000。 若要超過10000,就要使用 search_after。
排序 - sorting
預設的排序是使用 ascending
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| # 依 <sort_field> 來排序 GET /_search { "sort": [ <sort_field> ] }
# 欄位 `created` 依照遞減的方式排序 GET /_search { "_source": "created", "sort": [ {"created": "desc"} ] }
# 指定多個欄位排序 ## 依照 pagination_time_minutes 遞增、 created 遞減的方式排序 ## 這裡的 `pagination_time_minutes: asc` 可以省略,寫出來是為了增加易讀性 GET /_search { "_source": ["created", "pagination_time_minutes"], "sort": [ {"pagination_time_minutes": "asc"} {"created": "desc"} ] }
|
注意!! ES 預設是使用 _score 遞減的方式來排序,若是其他欄位,預設則是遞增排序
依序一欄多值來排序
類似於 RDBMS 的 aggregation,將一個欄位中的多個值做運算,像是 avg
, min
, ‘max’ …etc。
1 2 3 4 5 6 7 8 9 10
| # 將 rating 做平均值,遞減排序 GET /_search { "sort": [ "rating": { "order": "desc", "mode": "avg } ] }
|
filters
可以使用 filter
來取得想要的資料,與 query
不同的是,filter
不影響計分,但 query
會影響。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| GET /_search { "query": { "bool": { "must": [ { "match": { "title": "pasta" } } ], "filter": [ { "range": [ "preparation_time_minutes": { "lte": 15 } ] } ] } } }
|
Reference
- Complete Guide to Elasticsearch
- Sort Search Result