0%

ElasticSearch 學習紀錄 Part10 - Query method

前言

這篇文章是出自於線上課程 Complete Guide to Elasticsearch 的所記錄的筆記。

這篇文章使用的 ES 版本為 7.16.2

這一篇文章要來介紹如何讓 Elastic 回傳 不同格式 或是 特定內容 的資料


正文

回傳格式 (Response format)

要讓 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,
...
}

分頁 - pagination

頁數的計算方式 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

  1. Complete Guide to Elasticsearch
  2. Sort Search Result