OpenSearchは、ソートプロセス全体を粗ソートと精密ソートの2つのフェーズに分割することにより、高い検索パフォーマンスを提供します。 粗ソートは、取得されたすべてのドキュメントから上位N個の高品質ドキュメントを選択するプロセスです。 次に、上位N個の高品質ドキュメントがスコアリングされ、精密ソートプロセスでソートされます。 このようにして、ユーザーは要件に最も一致するドキュメントを取得できます。 粗ソートは検索パフォーマンスに影響しますが、精密ソートは最終的なソート結果に影響します。 したがって、精密ソートの主要な要素を使用して、ドキュメントを効率的かつ簡単に粗ソートできます。 ドキュメントは、ソート式を使用して粗ソートおよび精密ソートされます。
アプリケーションのカスタムソート式を作成し、検索クエリでソート式を指定して結果をソートできます。 ソート式は、ランキング式とも呼ばれます。 ソート式は、基本演算、数学関数、および精密ソート関数をサポートしています。 基本演算には、算術演算、関係演算、論理演算、ビット演算、条件演算が含まれます。 OpenSearchでは、フォーラムやニュースアプリケーションなどの一般的なアプリケーションで、関連性によって検索結果をソートできます。 データ機能に基づいて適切な式テンプレートを選択し、選択したテンプレートを変更してカスタム式を生成できます。
関連性による精密ソートを実行する前に、ソートポリシーの仕組みを理解していることを確認してください。要件を満たすドキュメントがクエリに基づいて見つかった後、ドキュメントがソートされます。 詳細については、ソート句を参照してください。 ソート句を指定していない場合、またはソート句でランク関数を指定している場合は、関連性によってスコアが計算されます。
実際の検索ニーズに基づいて、粗ソートと精密ソートの式を設計できます。 典型的なシナリオでのソートファクターの設計と配置方法の詳細については、関連性による検索結果のソートを参照してください。 このトピックでは、ソートポリシーの設定方法について説明します。
算術演算、関係演算、論理演算、条件演算などの基本演算を実行するには、ソート式で数値またはNUMERIC型のフィールド値を使用する必要があります。 ほとんどの関数ベースの演算は、STRING型の値に対して実行できません。
基本演算
演算 | 演算子 | 説明 |
単項演算 | - | マイナス記号(-)は、特定の式を使用して取得された値の負の値を取得するために使用されます。 例:-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) | condパラメーター値がゼロ以外の場合、thenValueが返され、condパラメーター値がゼロの場合、elseValueが返されます。 たとえば、if(2、3、5)は3を返し、if(0、3、5)は5を返します。注:condパラメーターの値は、LITERAL型またはTEXT型の値などの文字列にすることはできません。 値の範囲は、INT32型の値の範囲と同じである必要があります。 |
IN演算 | i in [value1, value2, …, valuen] | iが集合[value1、value2、…、valuen]に含まれている場合、式は1を返します。 それ以外の場合、0が返されます。 たとえば、[2、4、6]の2は1を返し、[2、4、6]の3は0を返します。 |
数値関数
関数 | 説明 |
max(a, b) | aとbの間の大きい方の値を返します。 |
min(a, b) | aとbの間の小さい方の値を返します。 |
ln(a) | aの自然対数を返します。 |
log2(a) | 底が2のaの対数を返します。 |
log10(a) | 底が10のaの対数を返します。 |
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)プロジェクトに基づいて開発したプログラミング言語です。 CavaはJavaに似た構文を使用し、C ++と同じくらい効率的なパフォーマンスを実現できます。 Cavaはオブジェクト指向プログラミング言語です。 ジャストインタイム(JIT)コンパイルとさまざまなセキュリティチェックをサポートして、より堅牢なプログラムを実現します。 CavaとOpenSearchが提供するCavaライブラリを使用して、OpenSearch専用のソートプラグインを設計できます。 Cavaベースのソートプラグインには、OpenSearchでサポートされている式と比較して、次の利点があります。
より多様なカスタム設計:Cavaを使用すると、より多様な構文を使用してソートプラグインをカスタマイズできます。 たとえば、forループを使用したり、ビジネス要件に基づいて関数やクラスを定義したりできます。
メンテナンスが容易:Cavaベースのソートプラグインは、式よりも読みやすく、メンテナンスが容易です。
学習が容易:CavaはJavaに似た構文を使用します。 Javaに精通していれば、Cavaを理解して開発に簡単に使用できます。 これにより、学習コストが削減されます。
注:Cavaベースのプラグインは、専用アプリケーションでのみ使用できます。
手順
次の例は、テキスト関連性ベースのソート関数を使用して粗ソートと精密ソートポリシーを設定する方法を示しています。
1. 粗ソートポリシーを作成する:OpenSearchコンソールにログオンします。 ページの左上隅で、OpenSearch High-performance Search Editionを選択します。 左側のナビゲーションペインで、[検索設定センター]>[ソート設定]を選択します。 [ポリシー管理]をクリックし、[作成]をクリックします。 表示されるページで、[ポリシー名]を指定し、[スコープ]を[粗ソート]に、[タイプ]を[式]に設定します。 次に、[次へ]をクリックします。
[スコアリング特性]でstatic_bm25を選択し、[重み]を10に設定します。重みを10に設定すると、計算でスコアに10が乗算されます。
オプション。 検索フィールドを指定し、重みを設定します。 指定されたフィールドは属性フィールドである必要があり、INT、DOUBLE、FLOATタイプなどの数値のみがサポートされます。 重みを掛けたフィールド値のスコアもスコアに追加されます。
設定が完了したら、[戻る]をクリックして[ポリシー管理]ページに戻ります。
2. 精密ソートポリシーを作成する:OpenSearchコンソールにログオンします。 ページの左上隅で、OpenSearch High-performance Search Editionを選択します。 左側のナビゲーションペインで、[検索設定センター]>[ソート設定]を選択します。 [ポリシー管理]をクリックし、[作成]をクリックします。 表示されるページで、[ポリシー名]を指定し、[スコープ]を[精密ソート]に、[タイプ]を[式]に設定します。 次に、[次へ]をクリックします。
[組み込み関数]ドロップダウンリストからtext_relevanceを選択し、括弧内にクエリするフィールド名を入力して、[完了]をクリックします。
設定が完了したら、[戻る]をクリックして[ポリシー管理]ページに戻ります。
3. ソート結果を表示する:[検索テスト]ページで、粗ソートと精密ソートのフィールドを設定し、[ソート詳細の表示]をオンにします。 次の図は、各関数の計算されたスコアを示しています。
ドキュメントは、スコアに基づいて粗ソートされ、次に精密ソートされます。 クエリによって取得され、フィルターによってフィルターされたドキュメントは、粗ソートステージに入ります。 つまり、粗ソート式を使用して計算されたスコアに基づいて、これらのドキュメントから上位N個の高品質ドキュメントが選択されます。 次に、精密ソート式を使用して、ユーザーの要件に最も一致するドキュメントが返されます。 スコアは次のように計算されます。
粗ソートのみが設定されている場合、ドキュメントスコアは10,000に粗ソート式を使用して計算された結果を加えたものになります。 ドキュメントスコアの最大値は20,000です。 つまり、実際のドキュメントスコアが20,000を超える場合でも、表示されるスコアは20,000のままです。
精密ソートのみが設定されている場合、ドキュメントスコアは10,000に精密ソート式を使用して計算された結果を加えたものになります。 ドキュメントスコアに上限はありません。
粗ソートと精密ソートの両方が設定されている場合、精密ソートステージに入ったドキュメントの最終スコアは10,000に精密ソート式を使用して計算された結果を加えたものになり、粗ソートのみされた他のドキュメントの最終スコアは10,000に粗ソート式を使用して計算された結果を加えたものになります。 最終スコアの最大値は20,000です。 つまり、実際のドキュメントスコアが20,000を超える場合でも、最終スコアは20,000のままです。
複数の粗ソートルールと精密ソートルールを作成できます。 ただし、クエリでは、一度に1つの粗ソートルールと1つの精密ソートルールのみを使用できます。
first_rank_nameには、1つのソート式名のみを指定できます。 複数の粗ソート式を同時に使用することはできません。
second_rank_nameには、1つのソート式名のみを指定できます。 複数の精密ソート式を同時に使用することはできません。
SDK設定
Java用SDK:
// 粗ソート式と精密ソート式を指定します。 この例では、デフォルトの式が使用されています。
Rank rank =newRank();
rank.setFirstRankName("default");// 粗ソートポリシーの名前
rank.setSecondRankName("default");// 精密ソートポリシーの名前
rank.setReRankSize(5);// 精密ソート式に基づいてソートするドキュメントの数を指定します。
PHP用SDK:
// 粗ソート式を指定します。
$params->setFirstRankName('default');
// 精密ソート式を指定します。
$params->setSecondRankName('default');
使用上の注意
コードで指定された粗ソート式と精密ソート式は、OpenSearchコンソールで設定されたデフォルトの粗ソート式と精密ソート式よりも優先されます。
次の例は、コードでソート情報を確認する方法を示しています。
キーと値のペアformat:fulljson;をconfig句に追加します。
返された結果で、sortExprValuesはドキュメントスコアを示します。
sortExprValues値は、sort句のソートフィールドの値を含む配列です。 例:
sort=-price;-RANK
この場合、sortExprValuesは[価格、ドキュメントスコア]であり、OpenSearchコンソールはドキュメントスコアを使用してドキュメントをソートします。
sort句が指定されていない場合、OpenSearchコンソールはデフォルトのソート結果を使用します。