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 in (2, 4, 6) は 1 を返し、3 in (2, 4, 6) は 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() | 協定世界時(UTC)1970年1月1日00:00:00からの経過秒数を返します。 |
random() | 0から1までのランダムな値を返します。 |
組み込み機能関数
OpenSearchは、位置情報サービス(LBS)、テキスト、適時性タイプなどのさまざまな粗ソート関数を提供します。ソート式で機能関数を組み合わせて、複雑な関連性に基づくソートを実行できます。
Cavaベースのプラグイン
Cavaは、OpenSearchエンジニアチームが低レベル仮想マシン(LLVM)プロジェクトに基づいて開発した効率的なプログラミング言語です。CavaはJavaに似た構文を使用し、C ++と同等の性能を実現できます。Cavaはオブジェクト指向プログラミング言語です。Just-In-Time(JIT)コンパイルとさまざまなセキュリティチェックをサポートして、より堅牢なプログラムを実現します。CavaとOpenSearchが提供するCavaライブラリを使用して、OpenSearch専用のソートプラグインを設計できます。Cavaベースのソートプラグインには、OpenSearchでサポートされている式と比較して、次の利点があります。
より多様なカスタム設計:Cavaを使用すると、より多様な構文を使用してソートプラグインをカスタマイズできます。たとえば、forループを使用したり、ビジネス要件に基づいて関数やクラスを定義したりできます。
メンテナンスが容易:Cavaベースのソートプラグインは式よりも読みやすく、メンテナンスが容易です。
学習が容易:CavaはJavaに似た構文を使用します。Javaに精通している場合は、Cavaを簡単に理解して開発に使用できます。これにより、学習コストが削減されます。
注:Cavaベースのプラグインは、専用アプリケーションでのみ使用できます。
手順
次の例は、テキスト関連性ベースのソート関数を使用して粗ソートポリシーと精密ソートポリシーを設定する方法を示しています。
1. 粗ソートポリシーを作成する:OpenSearchコンソールにログインします。左側のナビゲーションペインで、[検索アルゴリズムセンター]>[ソート設定]を選択します。[ポリシー管理]ページで、[作成]をクリックします。[ポリシーの作成]ページで、[ポリシー名]の値を入力し、[スコープ]パラメーターを[粗ソート]に、[タイプ]パラメーターを[式]に設定します。次に、[次へ]をクリックします。


[ソート設定] ステップで、[スコアリング特性] ドロップダウンリストから static_bm25 を選択し、[重み] を 10 に設定します。重みが 10 に設定されている場合、スコアは計算で 10 倍されます。

検索フィールドを指定して重みを設定することもできます。指定されたフィールドは 属性 フィールドである必要があり、INT、DOUBLE、FLOAT タイプなどの数値フィールドのみがサポートされます。重みを掛けたフィールド値のスコアもスコアに追加されます。
設定が完了したら、[戻る] をクリックして [ポリシー管理] ページに戻ります。

2. 精密ソートポリシーを作成する:OpenSearchコンソールにログインします。左側のナビゲーションペインで、[検索アルゴリズムセンター]>[ソート設定]を選択します。[ポリシー管理]ページで、[作成]をクリックします。[ポリシーの作成]ページの[基本情報]手順で、ポリシー名を指定し、[スコープ]パラメーターを[精密ソート]に、[タイプ]パラメーターを[式]に設定します。次に、[次へ]をクリックします。


[ソート設定] ステップで、[組み込み関数] ドロップダウンリストから text_relevance (field_name) を選択し、括弧内にクエリするフィールド名を入力して、[完了] をクリックします。

設定が完了したら、[戻る] をクリックして [ポリシー管理] ページに戻ります。

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 =new Rank();
rank.setFirstRankName("default");// 粗排ポリシーの名前
rank.setSecondRankName("default");// 精排ポリシーの名前
rank.setReRankSize(5);// 精排式に基づいてソートするドキュメントの数を指定します。PHP用SDK:
// 粗ソート式を指定します。
$params->setFirstRankName('default');
// 精密ソート式を指定します。
$params->setSecondRankName('default');使用上の注意
コードで指定された粗ソート式と精密ソート式は、OpenSearchコンソールで設定されたデフォルトの粗ソート式と精密ソート式よりも優先されます。
コードにパラメーターを追加することで、ドキュメントのソート詳細を表示できます。
方法:config句にformat:fulljsonパラメーターを追加します。
戻り値では、sortExprValuesパラメーターはドキュメントのソート情報を示します。

sortExprValuesパラメーターの値は配列であり、これはsort句のsortフィールドの値です。例:
sort=-price;-RANKこの場合、sortExprValuesパラメーターの値は[価格、ドキュメントスコア]の形式です。
sort句を設定しない場合、sortExprValuesパラメーターの値はデフォルトでドキュメントスコアになります。