検索エンジンには高い検索パフォーマンスが求められます。この要求を満たすため、システムは 2 段階のソートプロセスを採用しています。ラフソートとファインソートです。ラフソート段階では、初期検索結果から高品質なドキュメントのサブセット (上位 N 件の結果) を迅速に選択します。次に、これらのドキュメントはファインソートで詳細なスコアリングが行われ、最も関連性の高い結果を返します。ラフソートは主にパフォーマンスに影響し、ファインソートは最終的な結果の品質を決定します。したがって、ラフソートはシンプルかつ効率的である必要があり、ファインソートの主要な要素のみを使用します。両方の段階は、ソート式を使用して設定します。
ソート式 (ランキング式とも呼ばれます) を使用すると、アプリケーションの検索結果のランク付け方法をカスタマイズできます。クエリリクエストで式を指定して結果をソートします。ソート式では、基本演算 (算術、関係、論理、ビット、条件演算)、数学関数、およびファインソート関数 を使用できます。フォーラムやニュースサイトなどの一般的なアプリケーション向けに、OpenSearch は関連性ソート のベストプラクティスを用意しています。これらをテンプレートとして使用し、データの特性に基づいて変更して、独自の式を作成できます。
関連性ベースのランキング (ファインソート) を設定する前に、システムのデフォルトのソート動作を理解する必要があります。クエリに一致するドキュメントが見つかった後、ドキュメントはソート段階に入ります。詳細については、ソート句をご参照ください。ソート句を指定しない場合、またはソート句に明示的に RANK が含まれている場合、関連性スコアリング段階が開始します。
ラフソートとファインソートのソート式の設計は、検索要件によって異なります。関連性ソートに関する記事では、いくつかの典型的なシナリオにおいて、ランキング要素を設計および選択する方法について詳しく説明しています。
ソート式では、算術、関係、論理、条件演算などの基本演算には、数値または数値フィールドを使用する必要があります。ほとんどの関数は文字列型の演算に対応していません。
基本演算
|
演算 |
演算子 |
説明 |
|
単項演算 |
- |
マイナス記号 (-)。式の値を負にします。例:-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) |
a の正弦を返します。 |
|
cos(a) |
a の余弦を返します。 |
|
tan(a) |
a の正接を返します。 |
|
asin(a) |
a の逆正弦を返します。 |
|
acos(a) |
a の逆余弦を返します。 |
|
atan(a) |
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 は、LBS、テキスト、適時性関数など、さまざまなラフソート関数 を用意しています。これらをソート式で組み合わせることで、強力な関連性ソートを実装できます。
Cava プラグイン
Cava は、OpenSearch エンジンチームが LLVM をベースに開発した高性能プログラミング言語です。構文は Java に似ており、パフォーマンスは C++ に匹敵します。Cava はオブジェクト指向言語であり、ジャストインタイム (JIT) コンパイルとさまざまなセキュリティチェックをサポートしており、プログラムの堅牢性を確保します。Cava と提供される Cava ライブラリを使用して、OpenSearch でカスタムソートプラグインを作成できます。標準のソート式を使用する場合と比較して、Cava プラグインには次の利点があります。
-
より高いカスタマイズ性:Cava は、
forループや関数およびクラス定義など、式よりも豊富な構文機能を提供します。これにより、複雑なビジネス要件を実装できます。 -
より簡単なメンテナンス:Cava プラグインは、複雑なソート式よりも読みやすく、メンテナンスが容易です。
-
より低い学習コスト:Cava の構文は Java に似ているため、Java 開発者にとって習得が容易です。
注: Cava プラグイン は、専用アプリケーションでのみ設定できます。
操作手順
このセクションでは、テキスト関連性関数 を例として、ラフソート および ファインソート ポリシーの設定方法を示します。
-
粗い並べ替えポリシーを作成します。[OpenSearch コンソール] で、左上の [OpenSearch 高性能検索版] を選択します。[検索設定センター] > [並べ替え設定] > [ポリシー管理] に移動し、[作成] をクリックします。[ポリシー名] を入力し、[スコープ] を [粗い並べ替え] に、[タイプ] を [式] に設定してから、[次へ] をクリックします。
スコアリング機能として「static_bm25」を選択し、重みを「10」に設定します。重み 10 は、計算時にスコアが 10 倍されることを意味します。ソートに検索フィールドを追加することもできます。フィールドは属性フィールドであり、
INT、DOUBLE、FLOATなどの数値型である必要があります。フィールドに重みを設定すると、フィールドの値にその重みを掛けた値がソートスコアに追加されます。例として、sale_price フィールドをソートに追加し、pid フィールドの重みを
0.08に設定します。設定が完了したら、ポリシー管理ページに戻ります。「ソートポリシーが正常に設定されました」というメッセージが表示されます。[検索テスト] をクリックして、ソート設定を確認します。
-
ファインソートポリシーを作成します。 OpenSearch コンソールで [作成] をクリックし、[ポリシー名] を入力し、[スコープ] を [ファインソート] に、[タイプ] を [式] に設定し、次に [次へ] をクリックします。
組み込み関数から 'text_relevance' を選択し、括弧内にインデックスのフィールド名を入力して、[完了] をクリックします。[並べ替え設定] ステップで、[フィールド] および [組み込み関数] ドロップダウンリストを使用してソート式
text_relevance(brand)を生成し、[完了] をクリックします。設定が完了し、ポリシー管理ページに戻ります。 -
ソート結果を表示します。 検索テストページで、ラフソートとファインソートのパラメータを設定し、[ソートの詳細を表示] オプションを有効にします。
first_rank_nameパラメータをtest_1(ラフソート) に、second_rank_nameパラメータをtest_2(ファインソート) に設定します。その後、各関数のスコア計算を確認できます。各検索結果の下にソートの詳細が表示されます。これには、合計ソートスコア (例:
10000.2259030193) と、static_bm25、static_bm25*10、text_relevance(brand)などの各式の個別結果が含まれます。説明ドキュメントのスコアリングは、ラフソートとファインソートの 2 つの段階で行われます。クエリによって取得され、フィルタを通過したドキュメントは、まずラフソートが行われます。ラフソート式に基づいて高スコアのドキュメントが選択されます。次に、上位 N 件の結果がファインソート式を使用して正確にスコアリングされ、最適な結果が返されます。
-
ラフソートポリシーのみが設定されている場合、ドキュメントスコアは
(10000 + ラフソート式の結果)です。計算されたスコアが 20,000 を超える場合、20,000 に制限されます。 -
ファインソートポリシーのみが設定されている場合、ドキュメントスコアは
(10000 + ファインソート式の結果)です。スコアに上限はありません。 -
ラフソートとファインソートの両方のポリシーが設定されている場合、ファインソート段階に入るドキュメントの最終スコアは
(10000 + ファインソート式の結果)です。残りのドキュメントの最終スコアは(10000 + ラフソート式の結果)です。このスコアが 20,000 を超える場合、20,000 に制限されます。 -
複数のラフソートおよびファインソートルールを作成できます。ただし、クエリリクエストでは、一度に 1 つのラフソートルールと 1 つのファインソートルールのみを使用できます。
重要-
first_rank_nameパラメータは、1 つのソート式名のみに対応しています。複数のラフソート式を同時に使用することはできません。 -
second_rank_nameパラメータは、1 つのソート式名のみに対応しています。複数のファインソート式を同時に使用することはできません。
-
SDK 設定例
Java SDK の例:
// ラフソート式とファインソート式を設定します。この例ではデフォルトポリシーを使用します。
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;-RANKsortExprValuesには、priceフィールドの値の後に最終的なドキュメントスコアが含まれます。sort句を指定しない場合、sortExprValuesには最終的なドキュメントスコアのみが含まれます。