前言
這篇文章是出自於線上課程 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