๐ ์ฟผ๋ฆฌ ์ค๊ณ ์ค์ ์์ 10๊ฐ์ง
Elasticsearch์์ ์ฟผ๋ฆฌ ์ฑ๋ฅ๊ณผ ์ ํ๋์ ์ํฅ์ ์ฃผ๋ ๋ํ์ ์ธ ์ค์ 10๊ฐ์ง๋ฅผ ์ ๋ฆฌํ ๋ฌธ์์ ๋๋ค.
์ค์ ๊ฒ์ ์์ง์์ ํํ ๋ฐ์ํ๋ฉฐ, ์ฌ์ ์ ๋ฐฉ์งํ๊ฑฐ๋ ๋ฆฌํฉํฐ๋ง ์ ์ฃผ์ํด์ผ ํ ํฌ์ธํธ์ ๋๋ค.
1. โ filter
์์ด must
๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
must
๋ relevance score ๊ณ์ฐ ํฌํจ โ ์ฑ๋ฅ ์ ํ- ๋จ์ ์กฐ๊ฑด์ ๋ฐ๋์
filter
์ฌ์ฉ
"bool": {
"must": [ { "term": { "status": "active" } } ] // โ
}
โ ๊ฐ์ ์์:
"bool": {
"filter": [ { "term": { "status": "active" } } ]
}
2. โ from
๊ฐ์ ๋๋ฌด ํฌ๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
from: 10000
์ด์์ ์ฑ๋ฅ ๋ฌธ์ + ๊ธฐ๋ณธ max_result_window ์ด๊ณผ ์ค๋ฅ- deep pagination ๋นํจ์จ์
โ ํด๊ฒฐ ๋ฐฉ๋ฒ:
search_after
๋๋scroll API
์ฌ์ฉ
3. โ should
๋ง ์ฐ๊ณ minimum_should_match
๋๋ฝ
- ์กฐ๊ฑด์ด ์๋ฌด๊ฒ๋ ์ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ๊ฐ ๋จ (๋ชจ๋ ์ผ์น)
should
๋ง ์์ ๊ฒฝ์ฐ ์ต์ ๋งค์นญ ์กฐ๊ฑด ์ค์ ํ์
โ ๊ฐ์ ์์:
"bool": {
"should": [
{ "match": { "title": "์นด์นด์ค" } },
{ "match": { "content": "์นด์นด์ค" } }
],
"minimum_should_match": 1
}
4. โ wildcard
๋จ์ฉ
"*๊ฒ์์ด*"
ํํ๋ ์ ์ฒด ์ธ๋ฑ์ค๋ฅผ ์ค์บํ๊ฒ ๋์ด ์ฌ๊ฐํ ์ฑ๋ฅ ์ ํ ๋ฐ์
โ ๋์:
edge_ngram
๋๋prefix
,autocomplete index
์ค๊ณ ๊ณ ๋ ค
5. โ match_all
๋จ๋ฐ
- ํํฐ ์กฐ๊ฑด ์์ด ์ ์ฒด ๋ฌธ์ ๋ถ๋ฌ์ค๊ธฐ โ ๋๋ ํธ๋ํฝ ๋ฐ์ ์ํ
- ํ ์คํธ ์ธ์๋ ์ฌ์ฉ ์์
6. โ nested
ํ๋ ์ ๋ ฌ ๋๋ฝ
- nested ํ๋๋ฅผ ์ ๋ ฌ ์๋ํ๋ฉด ์ค๋ฅ ๋๋ ์๋ชป๋ ๊ฒฐ๊ณผ
โ ์์:
"sort": [
{
"comments.likes": {
"order": "desc",
"mode": "max",
"nested": {
"path": "comments"
}
}
}
]
7. โ ์ ๋ ฌ ํ๋๊ฐ text
ํ์
- text๋ ๋ถ์๋ ํ๋์ด๋ฏ๋ก ์ ๋ ฌ ๋ถ๊ฐ ๋๋ ์ฑ๋ฅ ์ ํ
โ
ํด๊ฒฐ: multi-field๋ก keyword
ํ๋ ์ฌ์ฉ
"title": {
"type": "text",
"fields": {
"raw": { "type": "keyword" }
}
}
8. โ terms
์ฟผ๋ฆฌ์ ๋ฐฐ์ด์ด ์๋ ๋จ์ผ ๊ฐ ์ฌ์ฉ
terms
๋ ๋ฐฐ์ด๋ง ๋ฐ์ โ ๋จ์ผ ๊ฐ ์ ๋ฌ ์ ์ฟผ๋ฆฌ ์คํจ
"terms": { "status": "active" } // โ
"terms": { "status": ["active"] } // โ
9. โ ์ ๋ ฌ ๊ธฐ์ค์ด ๋ถ๋ช ํํ๊ฑฐ๋ ์ค๋ณต ๋ฐ์
_score
์ธ ์ ๋ ฌ ํ๋ ์์ผ๋ฉด ์ค๋ณต ํ์ด์ง ๋ฐ์ ์ํ- ํญ์
tiebreaker
ํ๋๋ฅผ ํจ๊ป ๋ฃ์ด์ผ ํจ
"sort": [
{ "created_at": "desc" },
{ "_id": "asc" } // ์์ ์ ํ์ด์ง์ ์ํด ์ถ๊ฐ
]
10. โ range
์ฟผ๋ฆฌ์์ ํฌ๋งท ์ค๋ฅ
- ๋ ์ง ํ๋์ ์๋ชป๋ ํฌ๋งท ์ ๋ฌ โ ๊ฒ์ ์คํจ
โ ๊ฐ์ :
"range": {
"created_at": {
"gte": "2023-01-01T00:00:00Z",
"lt": "2023-12-31T23:59:59Z"
}
}
โ ์์ฝ
์ค์ ํญ๋ชฉ | ์์ฝ ์ค๋ช |
---|---|
filter ๋ฏธ์ฌ์ฉ | score ๊ณ์ฐ์ผ๋ก ์ฑ๋ฅ ์ ํ |
from ๋๋ฌด ํผ | deep pagination ๋ฌธ์ |
should๋ง ์ฌ์ฉ | minimum_should_match ์์ผ๋ฉด ๋ฌด์๋ฏธ |
wildcard ๋จ์ฉ | ๋๋ฆฐ ์ฟผ๋ฆฌ โ ngram/prefix ์ ๋ต ํ์ |
nested ์ ๋ ฌ ๋๋ฝ | nested ํ๋ ์ ๋ ฌ ์ nested path ํ์ |
text๋ก ์ ๋ ฌ | keyword ํ๋๋ก ์ ๋ ฌํด์ผ ํจ |
terms์ ๋ฐฐ์ด ๋๋ฝ | ๋จ์ผ ๊ฐ ๋ฃ์ผ๋ฉด ์ค๋ฅ ๋ฐ์ |
tie-breaker ํ๋ ์์ | ํ์ด์ง ์ค๋ณต ๋ฌธ์ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ |
range ๋ ์ง ํฌ๋งท ์ค๋ฅ | date ํฌ๋งท ๋ช ์ ํ์ |
match_all ๊ณผ์ฉ | ํ ์คํธ ์ธ ์ฌ์ฉ ์์ |