๐Ÿšจ ์‹ค์ „ ๋งคํ•‘ ์‹ค์ˆ˜ ๋ชจ์Œ

์ด ๋ฌธ์„œ๋Š” Elasticsearch๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋งคํ•‘ ์„ค๊ณ„ ์‹ค์ˆ˜ ์‚ฌ๋ก€๋“ค์„ ์ •๋ฆฌํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค.
์‹ค์ˆ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋„ ํ•จ๊ป˜ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


1. โŒ keyword ํ•„๋“œ์— match ์‚ฌ์šฉ

๋ฌธ์ œ ์„ค๋ช…

keyword ํ•„๋“œ๋Š” ๋ถ„์„๋˜์ง€ ์•Š์€ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— match ์ฟผ๋ฆฌ๋กœ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Œ.

"match": {
  "status": "published"  // keyword ํ•„๋“œ์ผ ๊ฒฝ์šฐ ๋™์ž‘ X
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • match ๋Œ€์‹  term ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
"term": {
  "status": "published"
}

2. โŒ text ํ•„๋“œ๋กœ ์ •๋ ฌ

๋ฌธ์ œ ์„ค๋ช…

text ํ•„๋“œ๋Š” ๋ถ„์„๋œ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋‚˜์จ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • multi-field๋ฅผ ํ™œ์šฉํ•˜์—ฌ text + keyword ๊ตฌ์กฐ๋กœ ์„ค๊ณ„
  • ์ •๋ ฌ์€ .raw ๋˜๋Š” keyword ํ•„๋“œ๋กœ ์ˆ˜ํ–‰
"title": {
  "type": "text",
  "fields": {
    "raw": {
      "type": "keyword"
    }
  }
}

3. โš ๏ธ ๋™์  ๋งคํ•‘ ์˜ค์šฉ (dynamic mapping)

๋ฌธ์ œ ์„ค๋ช…

  • JSON ๋ฌธ์„œ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ํ•„๋“œ ํƒ€์ž…์ด ์ง€์ •๋จ
  • ์˜ˆ: "price": "100" โ†’ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋˜์–ด ์ง‘๊ณ„/์ •๋ ฌ ๋ถˆ๊ฐ€๋Šฅ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์‚ฌ์ „์— ๋ช…์‹œ์  ๋งคํ•‘ ์ง€์ •
  • ๋˜๋Š” dynamic: strict๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
"dynamic": "strict"

4. ๐Ÿ’ฅ ํ•„๋“œ ํญ๋ฐœ (Field Explosion)

๋ฌธ์ œ ์„ค๋ช…

  • JSON ๊ตฌ์กฐ์— ๋”ฐ๋ผ 1,000๊ฐœ ์ด์ƒ์˜ ํ•„๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ
  • ์˜ˆ: ์‚ฌ์šฉ์ž ์ •์˜ ํ•„๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ

๋ฌธ์ œ์ 

  • ๋งคํ•‘ ํฌ๊ธฐ ์ฆ๊ฐ€, ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ์ €ํ•˜, ํด๋Ÿฌ์Šคํ„ฐ ๋ถˆ์•ˆ์ •

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • flattened ํƒ€์ž… ์‚ฌ์šฉ ๋˜๋Š” nested ํ•„๋“œ ๊ตฌ์กฐ ์žฌ์„ค๊ณ„
"custom_fields": {
  "type": "flattened"
}

5. ๐Ÿ“† date/integer ํƒ€์ž… ๋ˆ„๋ฝ

๋ฌธ์ œ ์„ค๋ช…

  • ๋‚ ์งœ๋‚˜ ์ˆซ์ž ํ•„๋“œ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋จ
  • ๊ฒ€์ƒ‰, ์ •๋ ฌ, ์ง‘๊ณ„์— ์˜ค๋ฅ˜ ๋ฐœ์ƒ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ช…์‹œ์ ์œผ๋กœ date, integer, long ํƒ€์ž… ์„ค์ •
"created_at": {
  "type": "date"
},
"count": {
  "type": "integer"
}

โœ… ์š”์•ฝ ์ •๋ฆฌ

์‹ค์ˆ˜ ํ•ญ๋ชฉ๋ฐœ์ƒ ์›์ธํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
keyword์— match ์‚ฌ์šฉ๋ถ„์„ ๋ถˆ๊ฐ€๋Šฅ ํ•„๋“œ์— match ์‚ฌ์šฉterm ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝ
text ์ •๋ ฌ๋ถ„์„๋œ ํ•„๋“œ๋กœ ์ •๋ ฌ ์‹œ๋„keyword ์„œ๋ธŒํ•„๋“œ๋กœ ์ •๋ ฌ
dynamic mapping ๊ณผ์šฉ์ž๋™ ํƒ€์ž… ์ง€์ •์— ์˜์กด๋ช…์‹œ์  ๋งคํ•‘ ๋˜๋Š” strict ์ ์šฉ
ํ•„๋“œ ํญ๋ฐœํ•„๋“œ ์ˆ˜ ๊ณผ๋„ํ•˜๊ฒŒ ๋งŽ์Œflattened ํƒ€์ž… ๋˜๋Š” ์„ค๊ณ„ ๋ณ€๊ฒฝ
date/integer ๋ˆ„๋ฝ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋จํƒ€์ž… ๋ช…์‹œ: date, integer ๋“ฑ