๐Ÿ” ์ถ”์ฒœ/์ •ํ™•๋„/์ตœ์‹ /์ธ๊ธฐ์ˆœ ๋ถ„๋ฆฌ ์ „๋žต

Elasticsearch์—์„œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์–‘ํ•œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ „๋žต์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์˜ ๋‹ˆ์ฆˆ์— ๋”ฐ๋ผ ์ •ํ™•๋„, ์ธ๊ธฐ, ์ตœ์‹ , ์ถ”์ฒœ์ˆœ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1. ๐ŸŽฏ ์ •ํ™•๋„ ์ •๋ ฌ (Relevance Based)

์ „๋žต

  • multi_match ์ฟผ๋ฆฌ๋กœ ๋‹ค์–‘ํ•œ ํ•„๋“œ ๊ฒ€์ƒ‰
  • ์ค‘์š”ํ•œ ํ•„๋“œ์—๋Š” boost ์ ์šฉ
{
  "multi_match": {
    "query": "์นด์นด์˜ค",
    "fields": ["title^3", "content", "tags^2"],
    "type": "best_fields"
  }
}
  • title ํ•„๋“œ๋Š” ^3 โ†’ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜ ๊ธฐ์—ฌ
  • tags๋Š” ^2 โ†’ ์ค‘๊ฐ„ ๊ฐ€์ค‘์น˜

2. ๐Ÿ”ฅ ์ธ๊ธฐ์ˆœ ์ •๋ ฌ (Popularity Based)

์ „๋žต

  • likes, clicks ๋“ฑ์˜ ์ˆ˜์น˜ ํ•„๋“œ๋ฅผ ์ ์ˆ˜์— ๋ฐ˜์˜
  • function_score + field_value_factor ์‚ฌ์šฉ
{
  "function_score": {
    "query": {
      "match": {
        "title": "์นด์นด์˜ค"
      }
    },
    "functions": [
      {
        "field_value_factor": {
          "field": "likes",
          "factor": 1.5,
          "modifier": "sqrt",
          "missing": 0
        }
      },
      {
        "field_value_factor": {
          "field": "clicks",
          "factor": 0.5,
          "modifier": "log1p",
          "missing": 1
        }
      }
    ],
    "score_mode": "sum",
    "boost_mode": "replace"
  }
}

3. ๐Ÿ•’ ์ตœ์‹ ์ˆœ ์ •๋ ฌ (Latest First)

์ „๋žต

  • createdAt ํ•„๋“œ๋กœ ์ •๋ ฌ
{
  "sort": [
    { "createdAt": { "order": "desc" } }
  ]
}
  • ์ตœ์‹  ๋ฌธ์„œ๊ฐ€ ๋จผ์ € ๋…ธ์ถœ๋จ
  • relevance ์ ์ˆ˜๋Š” ๋ฌด์‹œ๋จ

4. ๐Ÿง  ์ถ”์ฒœ์ˆœ ์ •๋ ฌ (Recommendation Ranking)

์ „๋žต

  • ์ •ํ™•๋„ ร— ์ธ๊ธฐ ร— ์ตœ์‹ ์„ฑ ์กฐํ•ฉ
  • function_score๋กœ ํ†ตํ•ฉ ์ ์ˆ˜ ๊ณ„์‚ฐ
{
  "function_score": {
    "query": {
      "multi_match": {
        "query": "์นด์นด์˜ค",
        "fields": ["title^3", "content", "tags^2"]
      }
    },
    "functions": [
      {
        "field_value_factor": {
          "field": "likes",
          "factor": 1.2,
          "modifier": "sqrt"
        }
      },
      {
        "gauss": {
          "createdAt": {
            "origin": "now",
            "scale": "10d",
            "decay": 0.5
          }
        }
      }
    ],
    "score_mode": "sum",
    "boost_mode": "multiply"
  }
}
  • ์ •ํ™•๋„๋Š” ๊ธฐ๋ณธ _score
  • likes: ์ธ๊ธฐ ์ ์ˆ˜
  • gauss(createdAt): ์ตœ์‹ ์„ฑ ์ ์ˆ˜
  • multiply๋กœ ๊ฒฐํ•ฉ โ†’ ์ถ”์ฒœ์ˆœ

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

์ •๋ ฌ ๊ธฐ์ค€์ „๋žต ์š”์•ฝ
์ •ํ™•๋„์ˆœmulti_match + boost
์ธ๊ธฐ์ˆœfunction_score + likes, clicks
์ตœ์‹ ์ˆœsort by createdAt desc
์ถ”์ฒœ์ˆœ์ •ํ™•๋„ ร— ์ธ๊ธฐ ร— ์ตœ์‹ ์„ฑ ์กฐํ•ฉ (function_score)