技術共有

Elasticsearch のカスタム スコアリングとスクリプト化されたスコアリング

2024-07-12

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

Elasticsearch では、デフォルトのスコアリング メカニズム (BM25 アルゴリズムなど) により、ほとんどの場合、良好な検索結果ランキングが提供されます。ただし、特定のシナリオでは、ビジネス ニーズに基づいて検索結果をより詳細に並べ替える必要がある場合があります。現時点では、Elasticsearch は、こ​​れらの複雑なニーズを満たすカスタム スコアリング (関数スコア クエリ) 関数とスクリプト スコアリング (スクリプト スコア) 関数を提供します。この記事では、Elasticsearch でスコアリングとスクリプト スコアリングをカスタマイズする方法について詳しく説明します。

1. カスタマイズされたスコアリング (関数スコアクエリ)

1.1 定義と原則

カスタム スコアリングを使用すると、事前定義された関数のセットに基づいて各ドキュメントのデフォルト スコアを変更できます。これらの関数は、ドキュメントのフィールド値、クエリ基準、またはその他の要素に基づいて新しい評価を計算できます。最終的に、Elasticsearch は元のスコアとカスタム スコアを組み合わせて、検索結果のランキングを決定します。

1.2 よく使われる機能

Elasticsearch には、カスタム スコアリング用のさまざまな組み込み関数が用意されています。これには次のものが含まれますが、これらに限定されません。

  • 重さ: 一致するすべてのドキュメントに均一の重みを割り当てます。
  • フィールド値係数: ドキュメント内のフィールド値に基づいて評価を計算します。
  • ランダムスコア: ドキュメントのランダムなスコアを生成します。
  • 減衰関数: ドキュメントと特定の点 (地理的位置、時間など) との間の距離に基づいて減衰スコアを計算します。一般的な減衰関数には、ガウス (gauss)、線形 (linear)、指数関数 (exp) などが含まれます。
  • スクリプトスコア: カスタム スクリプトを使用して評価を計算します。

1.3 例

電子商取引 Web サイトがあり、ユーザーが製品を検索するときに製品の価格と評価の両方を考慮したいとします。私たちは使うことができます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 が提供する強力な機能であり、ビジネス ニーズに応じて検索結果を絞り込むことができます。これらの機能を合理的に活用することで、ユーザーエクスペリエンスを向上させ、ユーザーの多様なニーズに応えることができます。ただし、カスタム スコアリングとスクリプト スコアリングはクエリの複雑さと計算コストを増加させる可能性があるため、実際のアプリケーションでは長所と短所を比較検討し、慎重に使用する必要があることに注意してください。