検索エンジンには、高い検索パフォーマンスが求められます。この要求を満たすために、OpenSearch では、基本ソートと高度ソートの 2 段階のソートプロセスを提供しています。基本ソートフェーズは、予備的なフィルターとして機能し、初期の検索結果から高品質なドキュメントを迅速に識別します。このフェーズで上位 N 件のドキュメントが選択され、高度ソートフェーズに進みます。高度ソートフェーズでは、これらのドキュメントが詳細に再スコアリングされます。そのため、基本ソートはパフォーマンスに大きな影響を与え、高度ソートは主にランキングの品質に影響を与えます。したがって、基本ソート式はシンプルかつ効果的であり、高度ソートフェーズの最も重要な要素のみを使用する必要があります。基本ソートと高度ソートは、ソート式を使用して設定します。
ソート式 (ランキング式) を使用すると、検索結果のランキング方法をカスタマイズできます。クエリで式を指定して、結果をソートできます。ソート式では、基本演算 (算術演算、関係演算、論理演算、ビット演算、条件演算)、数学関数、およびランキング特徴がサポートされています。フォーラムやニュースサイトなどの一般的なアプリケーションに対応するため、OpenSearch では 式テンプレートを提供しています。適切なテンプレートを選択し、変更することで、独自の式を作成できます。
関連性ランキング (高度ソート) を設定する前に、デフォルトのソートポリシーを理解してください。クエリやその他の句によってドキュメントが取得された後、ドキュメントはソートフェーズに入ります。詳細については、「ソート句」をご参照ください。ソート句を指定しない場合、またはソート句で明示的に RANK を指定した場合、関連性スコアリングフェーズがトリガーされます。
基本ソート式と高度ソート式の設計は、検索要件によって異なります。いくつかの典型的なシナリオにおけるランキング要素の設計方法について詳しくは、ベストプラクティス記事「Relevance in Practice」をご参照ください。
ソート式では、算術演算、関係演算、論理演算、条件演算などのすべての基本演算には、数値または数値フィールドが必要です。ほとんどの関数は、文字列型のフィールドをサポートしていません。
基本演算
|
演算 |
演算子 |
説明 |
|
単項演算 |
- |
否定演算子。式の値を否定します。例:-1 または -max(width)。 |
|
算術演算 |
+、-、*、/ |
例:width / 10。 |
|
関係演算 |
==、!=、>、<、>=、<= |
例:width >= 400。 |
|
論理演算 |
and、or、! |
例:width >= 400 and height >= 300、または !(a > 1 and b < 2)。 |
|
ビット演算 |
&、|、^ |
例:3 & (price ^ pubtime) + (price | pubtime)。 |
|
条件演算 |
if(cond, thenValue, elseValue) |
|
|
in |
i in (value1, value2, …, valuen) |
|
数学関数
|
関数 |
説明 |
|
max(a, b) |
a と b のうち、大きい方を返します。 |
|
min(a, b) |
a と b のうち、小さい方を返します。 |
|
ln(a) |
a の自然対数を返します。 |
|
log2(a) |
a の底 2 の対数を返します。 |
|
log10(a) |
a の底 10 の対数を返します。 |
|
sin(a) |
正弦関数。 |
|
cos(a) |
余弦関数。 |
|
tan(a) |
正接関数。 |
|
asin(a) |
逆正弦関数。 |
|
acos(a) |
逆余弦関数。 |
|
atan(a) |
逆正接関数。 |
|
ceil(a) |
a を最も近い整数に切り上げます。たとえば、ceil(4.2) は 5 を返します。 |
|
floor(a) |
a を最も近い整数に切り捨てます。たとえば、floor(4.6) は 4 を返します。 |
|
sqrt(a) |
a の平方根を返します。たとえば、sqrt(4) は 2 を返します。 |
|
pow(a, b) |
a の b 乗を返します。たとえば、pow(2, 3) は 8 を返します。 |
|
now() |
エポック (1970 年 1 月 1 日 00:00:00 UTC) からの経過秒数で現在時刻を返します。 |
|
random() |
[0, 1] の範囲内のランダムな値を返します。 |
組み込み関数
OpenSearch では、Location Based Services (LBS)、テキスト、適時性などに対応する豊富な 組み込み関数を提供しています。これらの関数をソート式で組み合わせることで、強力な関連性ランキングを実現できます。
Cava プラグイン
Cava は、OpenSearch エンジンチームが LLVM をベースに開発した高性能プログラミング言語です。構文は Java に似ており、パフォーマンスは C++ に匹敵します。Cava はオブジェクト指向プログラミング言語であり、JIT コンパイルをサポートし、プログラムの堅牢性を確保するためのさまざまなセキュリティチェックが含まれています。Cava とそのライブラリを使用して、OpenSearch でカスタムソートプラグインを作成できます。標準のソート式と比較して、Cava プラグインには以下の利点があります。
-
高いカスタマイズ性:Cava は、
forループ、関数定義、クラス定義など、式よりも広範な構文機能を提供し、カスタムビジネスロジックを実装できます。 -
メンテナンスの容易性:Cava で記述されたソートプラグインは、複雑な式よりも読みやすく、メンテナンスが容易です。
-
低い学習コスト:Cava の構文は Java に似ているため、Java 開発者にとって習得が容易です。
注意:Cava プラグインは、専用アプリケーションでのみサポートされています。
操作手順
この例では、テキスト関連性ソート関数を使用して基本ソートと高度ソートを設定する方法を説明します。
1. 基本ソートポリシーを作成する。OpenSearch コンソールで、[ソート設定] > [ポリシー管理] に移動し、[作成] をクリックします。[ポリシー名] を入力し、[スコープ] を [基本ソート] に設定し、[タイプ] を [式] に設定して、[次へ] をクリックします。
スコアリング特性として static_bm25 を選択し、重みを 10 に設定します。重み 10 は、計算中にスコアが 10 倍されることを意味します。検索フィールドを選択し、重みを設定することもできます。フィールドは、INT、DOUBLE、FLOAT などの数値型の属性フィールドである必要があります。フィールド値 * 重み のスコアが、合計ソートスコアに加算されます。
たとえば、[検索フィールド] から sale_price フィールドを選択し、重みを 0.08 に設定します。
設定を完了すると、ポリシー管理ページが表示されます。
2. 高度ソートポリシーを作成する。OpenSearch コンソールで、[ソート設定] > [ポリシー管理] に移動し、[作成] をクリックします。[ポリシー名] を入力し、[スコープ] を [高度ソート] に設定し、[タイプ] を [式] に設定して、[次へ] をクリックします。
ソート設定ステップで、[フィールド] ドロップダウンリストからフィールドを選択し、エディタにソート式 text_relevance(brand) を入力して、[完了] をクリックします。設定を完了すると、ソート設定ページが表示されます。
3. ソート効果を確認する。[検索テスト] ページで、first_rank_name パラメータを基本ソートポリシーの名前 (例:test_1) に設定します。second_rank_name パラメータを高度ソートポリシーの名前 (例:test_2) に設定します。[ソート詳細を表示] スイッチをオンにして、各ドキュメントと関数のスコア詳細を表示します。
ドキュメントのスコアリングは、基本ソートと高度ソートの 2 つのフェーズで実行されます。クエリがドキュメントを取得してフィルタリングした後、ドキュメントは基本ソートフェーズに入ります。基本ソート式は、より高いスコアのドキュメントを選択します。その後、上位 N 件の結果が高度ソートフェーズに渡され、高度ソート式に基づいて詳細なスコアリングが行われます。最後に、最適な結果が返されます。スコアリングロジックは以下のとおりです。
-
基本ソートポリシーのみが設定されている場合、ドキュメントスコアは (10000 + 基本ソート式の結果) です。合計スコアの上限は 20,000 です。
-
高度ソートポリシーのみが設定されている場合、ドキュメントスコアは (10000 + 高度ソート式の結果) です。合計スコアに上限はありません。
-
基本ソートポリシーと高度ソートポリシーの両方が設定されている場合、高度ソートフェーズに入るドキュメントの最終スコアは (10000 + 高度ソート式の結果) です。残りのドキュメントの最終スコアは (10000 + 基本ソート式の結果) となり、このスコアの上限は 20,000 です。
-
複数の基本ソートルールと高度ソートルールを作成できますが、クエリでは一度に 1 つの基本ソートルールと 1 つの高度ソートルールのみを使用できます。
-
first_rank_nameパラメータは、1 つのソート式名のみをサポートします。 -
second_rank_nameパラメータは、1 つのソート式名のみをサポートします。
SDK 設定例
Java SDK の例:
// 基本ソート式と高度ソート式を設定します。この例では "default" を使用します。
Rank rank =new Rank();
rank.setFirstRankName("default"); // 基本ソートポリシーの名前。
rank.setSecondRankName("default"); // 高度ソートポリシーの名前。
rank.setReRankSize(5); // 高度ソート用のドキュメント数。
PHP SDK の例:
// 基本ソート式を指定します。
$params->setFirstRankName('default');
// 高度ソート式を指定します。
$params->setSecondRankName('default');
注意:
-
コードでソートポリシーを指定すると、コンソールで設定されたデフォルトのポリシーが上書きされます。
-
コードでソート詳細を表示するには、次の手順を実行します。
方法:
config句にformat:fulljsonパラメータを追加します。レスポンスでは、
sortExprValuesにドキュメントのスコアが含まれます。"sortExprValues": [ "10000.0399786383" ], "property": { }sortExprValuesは、sort句内のソートフィールドの値が格納された配列です。例:sort=-price;-RANKこの場合、
sortExprValuesは [price, ドキュメントスコア] です。sortが設定されていない場合、sortExprValuesにはデフォルトでドキュメントスコアが格納されます。