この記事のトピックは、WeChat のグループ ディスカッションから生まれました。
Elasticsearch では、通常、ドキュメントの関連性を判断するためにクエリ プロセス中にスコアリング(またはスコアリング) が行われます。
デフォルトのスコアリング メカニズムではBM25が使用されますが、カスタム スコアリング クエリ (function_score)を使用して。ただし、スコアを 0 ~ 1 の範囲に制限したい場合は、クエリ内でスクリプトを使用する必要がある場合があります。
Elasticsearch スコアは、正確なスコア値ではなく、主に関連性ランキングに関係しているため、Elasticsearch スコアを 0 と 1 の間で比例的にマッピングしたい場合は、何らかの形式の正規化またはスケーリングを使用する必要があります。ただし、これは Elasticsearch の組み込み機能ではないため、自分で実装する必要があります。
1. 正規化された解釈
「正規化」について話すときは、データセットを共有の正規化されたスケールまたは範囲に変換することを意味します。これは、異なるデータセット間で公平な比較を行うのに役立つため、データ分析や機械学習では非常に一般的です。
たとえば、2 つのデータセットがあり、1 つは人の身長をセンチメートル単位で示し、もう 1 つは体重をキログラム単位で示しているとします。どちらのデータセットも範囲と単位が異なります。それらを直接比較した場合、有意義な結論を導き出すことは困難です。ただし、両方を0 から 1 の間に正規化すると、2 つのデータセットをより簡単に比較して理解できるようになります。
一般的な正規化方法は、Min-Max 正規化を使用することです。次の式を使用します。
ここで、Xmax
は最大値を表し、Xmin
は最小値を表します。なお、新しいデータが入ってくると最大値や最小値が変わる可能性があるので、その際は式中のXmaxとXminを再定義してエラーを避ける必要があります。
参考:https://www.cupoy.com/collection/0000018008CD5D70000000046375706F795F72656C656173654355/00000181709BCC8F000000056375706F795F72656C656173654349
2. Elasticsearchの正規化
この Elasticsearch のケースでは、スコア (_score) を 0 と 1 の間で正規化する方法について話しています。
デフォルトでは、Elasticsearch のスコアは、クエリの複雑さ、ドキュメントの数などの多くの要因に応じて大きく異なります。これらの評価をより簡単に比較して理解したい場合は、すべての評価が 0 から 1 の間に収まるように正規化できます。
つまり、正規化とは、データを均一な範囲に変換して、より簡単に比較して理解できるようにすることです。
正規化の方法は、評価範囲の上限と下限を知っているか、または何らかの近似値を受け入れるかどうかによって異なります。考えられるアプローチの 1 つは、最初にクエリを実行して最高評価と最低評価を取得し、次にこれらの値を使用して他のクエリの評価を正規化することです。
ただし、Elasticsearch のスコアリング メカニズムではさまざまな要素 (tf-idf、フィールド長など) が考慮され、クエリによって最高スコアと最低スコアが異なる可能性があるため、この方法では一貫性のない結果が生成される可能性があることに注意してください。
したがって、正規化されたスコアリングは Elasticsearch の複雑なタスクであり、クエリ レベルやアプリケーション レベルで処理する必要がある場合があります。スコアを 0 と 1 の間で比例的にマッピングするシステムを設計している場合は、Elasticsearch のスコアリング メカニズムが最適であるかどうかを再検討するか、Elasticsearch のスコアリングを補完または置き換える他の方法を見つける必要がある場合があります。
3. Elasticsearch 8.X スコアの正規化
Elasticsearch スコアを 0 から 1 の間で比例的にマッピングする場合は、まず可能なスコアの範囲を知る必要があります。この場合、最初にクエリを実行して、可能な最高スコアと最低スコアを見つけることが必要な場合があります。以下に簡単な例を示します。まず、クエリを実行してスコア範囲を見つけます。
GET /your_index/_search
{
"query": { "match_all": {} },
"size": 1,
"sort": [ { "_score": "desc" } ]
}
このクエリは、最高スコアのドキュメントを返します。返された結果から、最高スコアである _score フィールドを見つけることができます。並べ替え方向を「asc」に変更すると、最も低い評価を見つけることもできます。これらの値を正規化に使用できます。
最高スコア max_score と最低スコア min_score が見つかった場合、クエリ内でスクリプトを使用して正規化できます。
{
"query": {
"function_score": {
"query": { "match_all": {} },
"script_score": {
"script": {
"source": "(_score - params.min) / (params.max - params.min)",
"params": {
"max": max_score,
"min": min_score
}
}
}
}
}
}
このクエリでは、生のスコア (_score) を0 と 1の間で正規化するスクリプトを使用します。max_score と min_score を、前のクエリで見つかった値に置き換える必要があることに注意してください。
これは単なる単純な例であり、このアプローチにはいくつかの制限があることに注意してください。たとえば、最高評価と最低評価は、インデックスが更新されると変化する可能性があります。これらの値を定期的に更新したり、クエリごとにこれらの値を計算したりする必要がある場合があり、クエリのパフォーマンスに影響を与える可能性があります。
また、このスクリプトは、スコアが常にmin_scoreとmax_scoreの間にあることを前提としています。新しいドキュメントまたはクエリの結果がこの範囲外のスコアになった場合、このスクリプトは 0 未満または 1 より大きい値を返すことがあります。
この方法を使用する場合は、これらの制限を考慮し、実際の状況に応じて調整する必要があります。
4. Elasticsearch 8.X 正規化の実践
次に、実際の操作例を通じてこのプロセスを説明します。
4.1 最大スコアを取得する
POST kibana_sample_data_ecommerce/_search
{
"_source": [""],
"query": {
"match": {
"customer_full_name": "Underwood"
}
},
"size": 10,
"sort": [
{
"_score": "desc"
}
]
}
結果は 4.4682097 になります。
4.2 最低スコアを取得する
POST kibana_sample_data_ecommerce/_search
{
"_source": [""],
"query": {
"match": {
"customer_full_name": "Underwood"
}
},
"size": 10,
"sort": [
{
"_score": "asc"
}
]
}
結果: 3.731265 を取得します。
4.3 0-1 の間のスコアの計算
POST kibana_sample_data_ecommerce/_search
{
"from": 0,
"size": 10,
"_source": [
""
],
"sort": [
{
"_score": {
"order": "asc"
}
}
],
"query": {
"script_score": {
"query": {
"match": {
"customer_full_name": "Underwood"
}
},
"script": {
"source": "(_score - params.min) / (params.max - params.min)",
"params": {
"max": 4.4682097,
"min": 3.731265
}
}
}
}
}
これらの手順を通じて、Elasticsearch でスコアを 0 と 1 の間で比例的にマッピングできます。
ただし、この方法には限界と課題があり、実際の状況に応じて調整および最適化する必要があります。
5. まとめ
この記事では、Elasticsearch でスコア正規化を実装する方法について詳しく説明します。
これには、最高評価と最低評価を取得し、クエリ内のスクリプトを通じて正規化を実行することが含まれます。この方法は、スコアを0 と 1の間で比例的にマッピングする場合にはうまく機能しますが、インデックスの更新によってスコア範囲が変化するなどの制限があり、新しいドキュメントやクエリによってスコアが事前設定範囲外になる可能性があります。
したがって、本稿では具体的な運用例を示しますが、実際のアプリケーションでは、状況に応じてユーザーが柔軟に調整、最適化する必要があります。
推奨読書
より多くの乾物をより短時間で素早く入手できます。
世界中の約 2,000 人以上の Elastic 愛好家と一緒に改善しましょう!
大型モデルの時代、一歩先行く先進乾物を学ぼう!