기술나눔

Elasticsearch 사용자 지정 채점 및 스크립트 채점

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Elasticsearch에서 기본 채점 메커니즘(예: BM25 알고리즘)은 대부분의 경우 좋은 검색 결과 순위를 제공할 수 있습니다. 그러나 일부 특정 시나리오에서는 비즈니스 요구 사항에 따라 검색 결과를 보다 세부적으로 정렬해야 할 수도 있습니다. 이때 Elasticsearch는 이러한 복잡한 요구사항을 충족시키기 위해 맞춤형 스코어링(Function Score Query) 및 스크립트 스코어링(Script Score) 기능을 제공합니다. 이 문서에서는 Elasticsearch에서 채점 및 스크립트 채점을 사용자 정의하는 방법을 자세히 설명합니다.

1. 맞춤형 채점 (Function Score Query)

1.1 정의 및 원리

사용자 정의 채점을 사용하면 사전 정의된 기능 세트를 기반으로 각 문서의 기본 점수를 수정할 수 있습니다. 이러한 함수는 문서의 필드 값, 쿼리 기준 또는 기타 요소를 기반으로 새 등급을 계산할 수 있습니다. 궁극적으로 Elasticsearch는 원래 점수와 사용자 지정 점수를 결합하여 검색 결과의 순위를 결정합니다.

1.2 공통 기능

Elasticsearch는 다음을 포함하되 이에 국한되지 않는 사용자 지정 채점을 위한 다양한 내장 기능을 제공합니다.

  • 무게: 일치하는 모든 문서에 균일한 가중치를 할당합니다.
  • 필드 값 인자: 문서 내 필드 값을 기준으로 평점을 계산합니다.
  • 랜덤_점수: 문서에 대한 무작위 점수를 생성합니다.
  • 붕괴 함수: 문서와 특정 지점(지리적 위치, 시간 등) 사이의 거리를 기준으로 감쇠 점수를 계산합니다. 일반적인 감쇠 함수에는 가우스(gauss), 선형(linear), 지수(exp) 등이 포함됩니다.
  • 스크립트 점수: 사용자 정의 스크립트를 사용하여 평점을 계산합니다.

1.3 예

전자상거래 웹사이트가 있고 사용자가 제품을 검색할 때 제품 가격과 평점을 모두 고려하고 싶어한다고 가정해 보겠습니다.우리는 사용할 수 있습니다function_score이 요구 사항을 달성하기 위한 쿼리:

GET /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "手机"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "price",
            "modifier": "reciprocal",
            "params": {
              "scale": 100
            }
          }
        },
        {
          "field_value_factor": {
            "field": "rating",
            "missing": 1.0
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "replace"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

이 예에서는field_value_factor 이 함수는 항목의 가격과 평가를 기반으로 사용자 정의 평가를 계산합니다. 가격은 상호 붕괴(reciprocal ), 가격이 낮은 제품의 점수가 높도록 점수는 필드 값을 직접 사용합니다. 마지막으로 두 함수의 등급을 추가하고 원래 등급을 대체합니다.

2. 스크립트 점수

2.1 정의 및 원리

스크립트 채점을 통해 사용자 정의 스크립트 언어(예: Painless)를 사용하여 문서의 점수를 계산할 수 있습니다. 이 접근 방식은 최고의 유연성을 제공하며 거의 모든 논리를 기반으로 점수를 계산할 수 있습니다.

2.2 예

제품의 재고 수량에 따라 등급을 조정한다고 가정해 보겠습니다. 재고가 적은 제품은 등급이 더 높습니다.우리는 사용할 수 있습니다script_score이 요구 사항을 충족하는 기능은 다음과 같습니다.

GET /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "手机"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "Math.max(0, 1 - doc['stock'].value / 100.0)",
              "lang": "painless"
            }
          }
        }
      ],
      "score_mode": "multiply",
      "boost_mode": "replace"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

이 예에서는 Painless 스크립팅 언어를 사용하여 등급을 계산합니다. 스크립트는 제품의 재고 수량을 결정합니다(doc['stock'].value )는 재고량이 많을수록 점수가 낮을수록 점수가 높아집니다. 그런 다음 이 점수에 원래 평점을 곱하여 검색 결과의 최종 순위를 조정합니다.

3. 요약

사용자 지정 채점 및 스크립트 채점은 Elasticsearch에서 제공하는 강력한 기능으로, 이를 통해 비즈니스 요구 사항에 따라 검색 결과를 세분화할 수 있습니다. 이러한 기능을 합리적으로 사용함으로써 사용자 경험을 향상하고 사용자의 다양한 요구를 충족할 수 있습니다. 그러나 사용자 정의 채점 및 스크립트 채점은 쿼리 복잡성과 계산 비용을 증가시킬 수 있으므로 실제 응용 프로그램에서는 장단점을 고려하여 주의해서 사용해야 합니다.