OpsKvPairs を使用すると、CAVA スコアラー内でクエリの kvpairs 句からカスタム キーバリューパラメーターを読み取ることができます。7 つのメソッドはすべて同じパターンに従います。キーを検索し、生の CString 値または型変換された結果を返します。
仕組み
カスタムパラメーターは、次のチェーンを通じて検索クエリからスコアラーに伝達されます。
呼び出し元は、
kvpairs句をクエリに追加します (例:kvpairs=flag:abc)。init()で、request.getKVPairs()を呼び出してOpsKvPairsインスタンスを一度取得します。適切なゲッターを使用して、パラメーター値を読み取り、変換します。
必要に応じて、
score()で値を適用します。
パラメーターは score() ではなく init() で読み取ります。init() はクエリごとに1回実行され、score() は候補ドキュメントごとに1回実行されます。init() で解析することで、数千のスコアリングされたドキュメントにわたる冗長な作業を回避できます。
メソッド
| メソッド | 戻り値 |
|---|---|
CString getValue(CString key) | 生の CString 値 |
long getLong(CString key) | long |
float getFloat(CString key) | float |
double getDouble(CString key) | double |
long[] getLongArray(CString key, CString sep) | long[] |
float[] getFloatArray(CString key, CString sep) | float[] |
double[] getDoubleArray(CString key, CString sep) | double[] |
メソッドの詳細
getValue
シグネチャ: CString getValue(CString key)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
[戻り値:] パラメーター値を CString として返します。キーが kvpairs 句に存在しない場合は、null を返します。
例:
package users.scorer;
import cava.lang.CString;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
CString flag;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
flag = kvpairs.getValue("flag"); // "flag" が kvpairs 句にない場合は null
return true;
}
double score(OpsScoreParams params) {
if (flag != null && flag.equals("abc")) {
// apply custom logic
}
return 0.0;
}
}getLong
シグネチャ: long getLong(CString key)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
戻り値: long 型に変換されたパラメーター値。キーが存在しない場合、または値が数値として解析できない場合 (例: 非数値文字が含まれている場合) は 0 を返します。
例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
long flag;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
flag = kvpairs.getLong("flag"); // "flag" が存在しないか、有効な整数でない場合は 0
return true;
}
double score(OpsScoreParams params) {
if (flag == 1) {
// apply custom logic
}
return 0.0;
}
}getFloat
シグネチャ: float getFloat(CString key)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
戻り値: float 型に変換されたパラメーター値。キーが存在しない場合、または値が float 型に変換できない場合は 0 を返します。
例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
double ratio;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
ratio = kvpairs.getDouble("ratio"); // "ratio" が存在しないか、有効な double 型でない場合は 0
return true;
}
double score(OpsScoreParams params) {
if (ratio > 1) {
// カスタムロジックを適用
}
return 0.0;
}
}getDouble
シグネチャ: double getDouble(CString key)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
戻り値: double 型に変換されたパラメーター値。キーが存在しない場合、または値が double 型に変換できない場合は 0 を返します。
例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
double ratio;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
ratio = kvpairs.getDouble("ratio"); // "ratio" が存在しないか、有効な double でない場合は 0
return true;
}
double score(OpsScoreParams params) {
if (ratio > 1) {
// apply custom logic
}
return 0.0;
}
}getLongArray
シグネチャ: long[] getLongArray(CString key, CString sep)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
sep | CString | 値の文字列を個々の要素に分割するために使用されるデリミタ |
戻り値: デリミタ付きの値の文字列から解析された long[] 型配列。キーが存在しない場合、または値が long 型に変換できない場合は null を返します。
実行時エラーを回避するために、配列要素にアクセスする前に必ずnullをチェックし、length > 0であることを確認してください。
例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsDoc;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
long[] flags;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
// "flags" の値を ";" で分割します (例: "1;2;3" は [1, 2, 3] になります)。
flags = kvpairs.getLongArray("flags", ";");
params.getDoc().requireAttribute("flag");
return true;
}
double score(OpsScoreParams params) {
long docFlag = params.getDoc().docFieldLong("flag");
if (flags != null && flags.length > 0 && docFlag == flags[0]) {
// apply custom logic
}
return 0.0;
}
}getFloatArray
シグネチャ: float[] getFloatArray(CString key, CString sep)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
sep | CString | 値の文字列を個々の要素に分割するために使用されるデリミタ |
戻り値: デリミタ付きの値の文字列から解析された float[] 型配列。キーが存在しない場合、または値が float 型に変換できない場合は null を返します。
配列にアクセスする前にnullをチェックしてください。weightsとdocFlagsの長さが異なる場合、内積ループは実行されません。
例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsDoc;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
float[] weights;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
// "weights" の値を ";" で分割します (例: "0.5;0.3;0.2" は [0.5, 0.3, 0.2] になります)。
weights = kvpairs.getFloatArray("weights", ";");
params.getDoc().requireAttribute("flags");
return true;
}
double score(OpsScoreParams params) {
long[] docFlags = params.getDoc().docFieldLongArray("flags");
if (docFlags == null || weights == null) {
return 0.0;
}
double score = 0.0;
if (weights.length == docFlags.length) {
for (int i = 0; i < weights.length; ++i) {
score += docFlags[i] * weights[i];
}
}
return 0.0;
}
}getDoubleArray
シグネチャ: double[] getDoubleArray(CString key, CString sep)
パラメーター:
| パラメーター | 型 | 説明 |
|---|---|---|
key | CString | 読み取るカスタムパラメーターのキー |
sep | CString | 値の文字列を個々の要素に分割するために使用されるデリミタ |
戻り値: デリミタ付きの値の文字列から解析された double[] 型配列。キーが存在しない場合、または値が double 型に変換できない場合は null を返します。
配列にアクセスする前にnullをチェックしてください。weightsとdocFlagsの長さが異なる場合、内積ループは実行されません。
例:
package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsDoc;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
class BasicSimilarityScorer {
double[] weights;
boolean init(OpsScorerInitParams params) {
OpsRequest request = params.getRequest();
OpsKvPairs kvpairs = request.getKVPairs();
// "weights" の値を ";" で分割します (例: "0.5;0.3;0.2" は [0.5, 0.3, 0.2] になります)。
weights = kvpairs.getDoubleArray("weights", ";");
params.getDoc().requireAttribute("flags");
return true;
}
double score(OpsScoreParams params) {
long[] docFlags = params.getDoc().docFieldLongArray("flags");
if (docFlags == null || weights == null) {
return 0.0;
}
double score = 0.0;
if (weights.length == docFlags.length) {
for (int i = 0; i < weights.length; ++i) {
score += docFlags[i] * weights[i];
}
}
return 0.0;
}
}