๐ŸŽฏ ๊ฒ€์ƒ‰ ์ ์ˆ˜ ํŠœ๋‹ ์‹ค์Šต ์˜ˆ์ œ

์ด ๋ฌธ์„œ๋Š” function_score ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ relevance score๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ์‹ค์Šต ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
ํด๋ฆญ์ˆ˜, ์ข‹์•„์š”, ์ตœ์‹ ์„ฑ ๋“ฑ์„ ๋ฐ˜์˜ํ•œ ๋ณตํ•ฉ ์ ์ˆ˜ ๊ณ„์‚ฐ ์ „๋žต์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


1. โš™๏ธ function_score ๊ธฐ๋ณธ ๊ตฌ์กฐ

function_score ์ฟผ๋ฆฌ๋Š” ๊ฒ€์ƒ‰ ์ ์ˆ˜๋ฅผ ์ˆ˜์‹ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "query": {
    "function_score": {
      "query": { "match": { "title": "์นด์นด์˜ค" } },
      "functions": [
        ...
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  }
}
  • query: ๊ธฐ๋ณธ ๊ฒ€์ƒ‰ ์กฐ๊ฑด
  • functions: ๊ฐ€์ค‘์น˜๋‚˜ decay ํ•จ์ˆ˜ ๋“ฑ ์ ์šฉ
  • score_mode: ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์‚ฐ, ํ‰๊ท  ๋“ฑ์œผ๋กœ ๊ฒฐํ•ฉ
  • boost_mode: ๊ธฐ์กด ์ ์ˆ˜์™€ ํ•จ์ˆ˜ ์ ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ฉ์น ์ง€ ๊ฒฐ์ •

2. ๐Ÿ’ก likes, clicks ๊ธฐ๋ฐ˜ ๊ฐ€์ค‘์น˜ ์˜ˆ์‹œ

"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
    }
  }
]
  • likes: ์ œ๊ณฑ๊ทผ ๊ธฐ๋ฐ˜ ์ฆ๊ฐ€
  • clicks: ๋กœ๊ทธ ๊ธฐ๋ฐ˜ ์™„๋งŒํ•œ ์ฆ๊ฐ€

3. ๐Ÿ•’ createdAt ๊ธฐ๋ฐ˜ ์ตœ์‹  ๋ฌธ์„œ ์„ ํ˜ธ (decay ํ•จ์ˆ˜)

{
  "gauss": {
    "createdAt": {
      "origin": "now",
      "scale": "10d",
      "decay": 0.5
    }
  }
}
  • ์ตœ์‹  ๋ฌธ์„œ์ผ์ˆ˜๋ก ์ ์ˆ˜๊ฐ€ ๋†’๊ณ , ์˜ค๋ž˜๋ ์ˆ˜๋ก ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ์†Œ
  • scale: ๊ฐ์†Œ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฑฐ๋ฆฌ
  • decay: ๊ฐ์†Œ ๋น„์œจ

4. โš–๏ธ boost_mode์™€ score_mode ์กฐํ•ฉ

score_mode์˜๋ฏธ
sumํ•จ์ˆ˜ ๊ฒฐ๊ณผ ๋ชจ๋‘ ๋”ํ•จ
avgํ‰๊ท ๊ฐ’ ์‚ฌ์šฉ
max๊ฐ€์žฅ ํฐ ๊ฐ’๋งŒ ์‚ฌ์šฉ
multiply๋ชจ๋‘ ๊ณฑํ•จ (๊ฐ’์ด 0์ด๋ฉด ์ „์ฒด ์ ์ˆ˜ 0๋จ)
first์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉ
boost_mode๊ธฐ์กด _score์™€์˜ ๊ฒฐํ•ฉ ๋ฐฉ์‹
multiply_score * function_score
sum_score + function_score
replace_score ๋ฌด์‹œํ•˜๊ณ  function ์‚ฌ์šฉ
avgํ‰๊ท  ์‚ฌ์šฉ
max/minํฐ ๊ฐ’ ๋˜๋Š” ์ž‘์€ ๊ฐ’ ์‚ฌ์šฉ

โœ… ์ „์ฒด ์˜ˆ์‹œ ์ฟผ๋ฆฌ

{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": "์นด์นด์˜ค"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "likes",
            "factor": 1.2,
            "modifier": "sqrt",
            "missing": 0
          }
        },
        {
          "field_value_factor": {
            "field": "clicks",
            "factor": 0.8,
            "modifier": "log1p",
            "missing": 1
          }
        },
        {
          "gauss": {
            "createdAt": {
              "origin": "now",
              "scale": "15d",
              "decay": 0.4
            }
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  }
}

๐Ÿ“Œ ์š”์•ฝ

์š”์†Œ์„ค๋ช…
function_score์ ์ˆ˜ ๊ณ„์‚ฐ ๋ฐฉ์‹ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
field_value_factor์ˆซ์ž ํ•„๋“œ ๊ธฐ๋ฐ˜ ๊ฐ€์ค‘์น˜ ๋ฐ˜์˜
gauss์ตœ์‹ ์„ฑ ์ ์ˆ˜ ๋ฐ˜์˜ (decay)
score_mode์—ฌ๋Ÿฌ function ๊ฒฐํ•ฉ ๋ฐฉ์‹ (sum, avg ๋“ฑ)
boost_mode๊ธฐ์กด ์ ์ˆ˜์™€ ๊ฒฐํ•ฉ ๋ฐฉ์‹ (multiply, replace ๋“ฑ)