๐Ÿ“‰ ์ฟผ๋ฆฌ ์„ค๊ณ„ ์‹ค์ˆ˜ ์˜ˆ์‹œ 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 ๊ณผ์šฉํ…Œ์ŠคํŠธ ์™ธ ์‚ฌ์šฉ ์ž์ œ