概要
階層クエリを実行するために、クエリステートメントに layer 句を含めることができます。階層クエリ機能は、クエリ機能の拡張です。 layer 句を使用すると、データ取得プロセスをより効率的に管理できます。アプリケーションが使用されるシナリオに基づいてデータ取得プロセスを高速化し、アプリケーションシステムの全体的なパフォーマンスを向上させるために、layer 句を指定できます。 layer 句は、次の拡張機能を提供します。
データを取得する範囲を指定できます。
指定された範囲の優先順位を指定できます。
異なるクエリ句を使用して、異なる範囲からデータを取得できます。
構文
用語
用語 | 説明 |
seek | クエリプロセス中にドキュメントを検索する操作。 |
docid | ドキュメントの ID。OpenSearch Retrieval Engine Edition は、各ドキュメントの ID を生成します。OpenSearch Retrieval Engine Edition がクエリを実行すると、ドキュメント ID の昇順でドキュメントをスキャンします。 |
range | ドキュメント ID の範囲。クエリステートメントを作成するときに、OpenSearch Retrieval Engine Edition がスキャンするドキュメントの範囲を指定できます。 |
layer | レイヤーには、1 つ以上の範囲を含めることができます。範囲を含むレイヤーは、範囲のクエリ優先順位を決定します。レイヤーは、[query] layer、layer [query] range、および range docid seek name の形式で指定できます。 |
構文
{
"layer" : [
]
}範囲の指定
layer 句を使用して、データを取得する範囲を指定できます。
layer 句には、複数の単一レイヤーを含めることができます。単一レイヤーには、主に次の 2 つの要素が含まれています。
quota:現在のレイヤーから取得できるドキュメントの最大数。次の項目に注意してください。
quota と rank_size の関係:すべてのレイヤーの合計 quota は、rank_size パラメーターの値以下である必要があります。たとえば、layer 句に rank_size=10,quota:5;quota:7 を含めると、OpenSearch Retrieval Engine Edition は 2 番目のレイヤーから 5 つのドキュメントのみを取得します。
レイヤーから取得されたドキュメントの数が、そのレイヤーに指定された quota に達しない場合、OpenSearch Retrieval Engine Edition は残りの quota を次のレイヤーの quota に自動的に追加します。
後続の範囲から取得されたドキュメントは、レイヤー内の前の範囲から取得されたドキュメントよりも検索クエリに一致する可能性があります。OpenSearch Retrieval Engine Edition は、次の quota チェック方法をサポートしています。最初の方法では、OpenSearch Retrieval Engine Edition は、ドキュメントを取得するたびに現在のレイヤーの残りの quota をチェックします。2 番目の方法では、OpenSearch Retrieval Engine Edition は、ドキュメントを取得するときに現在のレイヤーの残りの quota をチェックしません。OpenSearch Retrieval Engine Edition がレイヤー内のすべてのドキュメントをスキャンした後、レイヤーの残りの quota をチェックし、残りの quota を次のレイヤーの quota に追加します。どちらの方法でも、取得されたドキュメントの数は rank_size パラメーターの値を超えることはできません。
layer 句を指定する場合、各レイヤーの quota のデフォルト値は 0 で、quota の最大値は uint32_t パラメーターの最大値です。
range:OpenSearch Retrieval Engine Edition が現在のレイヤーで必要なドキュメントをスキャンする基準となるドキュメント範囲。範囲を指定しない場合は、すべてのドキュメントがスキャンされます。範囲のデフォルト値は [0,docCount) です。OpenSearch Retrieval Engine Edition は、指定した属性フィールドを使用して、OpenSearch Retrieval Engine Edition が必要なドキュメントをスキャンする必要がある範囲を決定します。次の項目に注意してください。
属性フィールドを使用する必要があります。計算式を使用して範囲を指定しないでください。
範囲を定義するために使用する属性フィールドは、OpenSearch Retrieval Engine Edition がクエリするドキュメントをソートするために使用するのと同じソート方法に基づいてソートする必要があります。属性フィールドが同じ方法に基づいてソートされていない場合、指定された範囲は無効になり、OpenSearch Retrieval Engine Edition はドキュメントの全範囲をスキャンします。
属性フィールドは連続して指定する必要があります。属性フィールドの間に %sorted や %docid などの拡張キーワードを指定することはできません。
OpenSearch Retrieval Engine Edition は、%sorted、%unsorted、%other、%docid、%segmentid、%percent などの拡張キーワードもサポートしています。 %sorted は、現在のレイヤーでソートされた完全データと増分データを指定します。 %unsorted は、現在のレイヤーのソートされていないデータとリアルタイムデータを含む、ソートされていないデータを指定します。 %other は、指定されたレイヤーにないドキュメントの範囲を指定します。 %docid は、スキャンするドキュメントの範囲を指定します。 %segmentid は、スキャンするセグメントの範囲を指定します。 %percent は、範囲内でスキャンするドキュメントの割合を指定します。
layer 句に %sorted キーワードまたは %unsorted キーワードを指定しない場合、OpenSearch Retrieval Engine Edition はこれらのキーワードを layer 句に自動的に含めます。デフォルトモードでは、OpenSearch Retrieval Engine Edition は各レイヤーのドキュメントをソートします。取得されたドキュメントの数が現在のレイヤーに指定した quota を満たしていない場合、OpenSearch Retrieval Engine Edition は次のレイヤーのリアルタイムデータをスキャンします。
異なるクエリ句を指定して異なる範囲でクエリを実行する
異なる検索クエリまたはポスティングリストを使用して、各レイヤーのデータをクエリできます。句はセミコロン(;)で区切ります。レイヤーの数が句の数より多い場合、OpenSearch Retrieval Engine Edition は残りのレイヤーを最後の句に自動的に含めます。
例
このセクションでは、特定のシナリオで階層クエリ機能と OpenSearch Retrieval Engine Edition が提供する他のクエリ機能を組み合わせる方法について説明します。
インデックス構築中にドキュメントをソートし、指定された範囲からデータを取得する
オフラインソート機能が有効になっている場合、OpenSearch Retrieval Engine Edition は、指定したソートフィールドに基づいてドキュメントをソートします。たとえば、site_id フィールドをソートフィールドとして指定すると、同じサイトのドキュメントはインデックスリストで連続した範囲にソートされます。サイトのドキュメントをクエリする場合、サイトのドキュメントが属する範囲を指定して、スキャンプロセスを高速化できます。iphone を検索クエリとして使用してサイト 1 とサイト 7 からデータをクエリする場合、次の句を使用できます。
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
}
]
},
"quota" : 5000
}
]
}サイト 1 とサイト 7 から取得された結果の数が指定された quota に達せず、サイト 5 とサイト 10 から iphone キーワードをクエリする場合、次の句を使用できます。
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
}
]
},
"quota" : 5000
},
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [5,10]
}
]
},
"quota" : 0
}
]
}2 番目のレイヤーは、最初のレイヤーから取得された結果の数が指定された quota に達しない場合にのみスキャンされます。2 番目のレイヤーを構成するときに、quota パラメーターを 0 に設定するか、quota パラメーターを指定しません。ビジネス要件に基づいて、最初のレイヤーと 2 番目のレイヤーの quota パラメーターを指定することもできます。次のサンプルコードは、必要なパラメーターを指定する方法を示しています。
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
}
]
},
"quota" : 4000
},
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [5,10]
}
]
},
"quota" : 1000
}
]
}ドキュメントが複数のディメンションに基づいてソートされている場合、複数のディメンションに基づいて範囲を指定できます。たとえば、特定のドキュメントは site_id フィールドの値に基づいてソートされ、同じサイトのドキュメントはウェブページの静的安定性スコアに基づいてソートされます。静的安定性スコアが 100 より大きいウェブページを取得する場合、次の句を使用できます。
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
},
{
"field" : "static_score",
"values" : "[100,]"
}
]
},
"quota" : 4000
}
]
}
注:静的安定性スコアの範囲を二重引用符(" ")で囲みます。複数のクエリモードに基づいてデータをクエリする
特定のシナリオでは、期待される結果の数が過度に大きくない場合に十分な結果が必要です。結果の数が過度に大きい場合、クエリのパフォーマンスが低下する可能性があります。たとえば、複数のキーワードに基づいてデータをクエリする場合です。次の表では、A と B は 2 つの検索クエリを指定しています。
クエリモード | 取得された結果の数 | パフォーマンス |
A AND B | 少数の結果 | 高 |
A OR B | 多数の結果 | 低 |
A RANK B または B RANK A | 中程度の数の結果 | 中 |
前の表に記載されている情報に基づいて、異なるクエリモードを使用して異なる数の結果を取得し、異なるクエリパフォーマンスレベルを提供できます。ほとんどの場合、クエリのパフォーマンスを損なうことなく十分な結果を取得したい場合があります。この場合、固定クエリモードを使用して十分な数の結果を取得し、同時にクエリのパフォーマンスを確保することはできません。この問題を解決するには、1 つのクエリステートメントで複数のクエリモードを指定できます。
{
"query": "A OR B;A RANK B;A AND B",
"layer" : [
{
"quota" : 1000
},
{
"quota" : 1000
},
{
"quota" : 1000
}
]
}この方法を使用すると、十分な数の結果を取得し、クエリのパフォーマンスが効率的であることを確認できます。この方法では、結果と検索クエリの適合度も向上させることができます。大規模なクエリの場合、A AND B クエリモードを使用して A と B に一致する結果を取得します。小規模なクエリの場合、A OR B クエリモードを使用して十分な結果を取得します。
適時性の高いデータをクエリする
特定のシナリオでは、適時性の高いデータを取得する必要があります。この場合、OpenSearch Retrieval Engine Edition は最初にリアルタイムのソートされていないデータをクエリし、次にソートされた完全データと増分データをクエリします。また、%percent キーワードを使用して、検索エンジンがランクの高いソート済みドキュメントをスキャンする前に、ランクの低いソート済みドキュメントをクエリするように指示することもできます。
たとえば、iphone を検索クエリとして使用してリアルタイムデータをクエリし、返される結果が不十分な場合に、エンジンがソート済みドキュメントの最初の 50% をクエリする前に、ソート済みドキュメントの最後の 50% をクエリするように OpenSearch Retrieval Engine Edition に指示できます。次の句を使用できます。
{
"layer" : [
{
"range" : {
"index_type" : "%unsorted"
},
"quota" : 5000
},
{
"range" : {
"index_type" : "%sorted",
"fields" : [
{
"field" : "service_id",
"values" : [1,3]
}
],
"percent" : "[50,100)"
},
"quota" : 0
},
{
"range" : {
"index_type" : "%sorted",
"fields" : [
{
"field" : "service_id",
"values" : [1,3]
}
],
"percent" : "[0,50)"
},
"quota" : 0
}
]
}
注:%percent キーワードを使用して、[値 1、値 2) 形式で複数の範囲を指定できます。使用上の注意
layer 句はオプションです。