組み込みユーザー定義関数 (UDF)
複雑な関数
関数 | 説明 | バージョン |
指定されたフィールドの特定の値が、指定された値セットに含まれている場合、true を返します。 | すべて | |
指定されたフィールドの特定の値が、指定された値セットに含まれていない場合、true を返します。 | すべて | |
指定されたフィールドの転置インデックスが指定された条件を満たす場合、true を返します。 | すべて | |
指定された条件に基づいて転置インデックスを返します。この関数の構文は、HA3 でサポートされている query 句の構文と同じです。 | すべて | |
指定された経度と緯度に基づいて距離値を計算します。 | V3.7.5 以降 | |
V3.9.0 以降 | ||
V3.9.0 以降 |
例
サンプルクエリ
phone テーブルの全データをクエリする
SELECT nid, price, brand, size FROM phone ORDER BY nid LIMIT 1000
USE_TIME: 0.881, ROW_COUNT: 10
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
1 | 3599 | Huawei | 5.9 |
2 | 4388 | Huawei | 5.5 |
3 | 899 | Xiaomi | 5 |
4 | 2999 | OPPO | 5.5 |
5 | 1299 | Meizu | 5.5 |
6 | 169 | Nokia | 1.4 |
7 | 3599 | Apple | 4.7 |
8 | 5998 | Apple | 5.5 |
9 | 4298 | Apple | 4.7 |
10 | 5688 | Samsung | 5.6 |
contain
プロトタイプ
boolean contain(int32 a, const string b)
boolean contain(int64 a, const string b)
boolean contain(string a, const string b)
boolean contain(ARRAY<int32> a, const string b)
boolean contain(ARRAY<int64> a, const string b)
boolean contain(ARRAY<string> a, const string b)
説明
この関数を使用すると、a フィールドの値が b 値セットに含まれているかどうかを判断できます。
パラメーター
a: データテーブル内のフィールド。指定するフィールドは、INT32、INT64、または STRING 型の単一値フィールドまたは複数値フィールドにすることができます。
b: 定数文字列。指定した定数は縦棒 (|
) で区切ります。値が指定された定数のいずれかと一致する場合、この関数は true を返します。
戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値が b 値セットに含まれていることを示します。false の値は、a フィールドの値が b 値セットに含まれていないことを示します。
例
次のステートメントでは、contain
関数を使用して、nid フィールドの値が 1、2、または 3 である行のデータエントリをクエリします。
SELECT nid, price, brand, size FROM phone WHERE contain(nid, '1|2|3') ORDER BY nid LIMIT 100
USE_TIME: 0.059, ROW_COUNT: 3
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
1 | 3599 | Huawei | 5.9 |
2 | 4388 | Huawei | 5.5 |
3 | 899 | Xiaomi | 5 |
notcontain
プロトタイプ
boolean notcontain(int32 a, const string b)
boolean notcontain(int64 a, const string b)
boolean notcontain(string a, const string b)
boolean notcontain(ARRAY<int32> a, const string b)
boolean notcontain(ARRAY<int64> a, const string b)
boolean notcontain(ARRAY<string> a, const string b)
説明
この関数を使用すると、a フィールドの値が b 値セットに含まれていないかどうかを判断できます。
パラメーター
a: データテーブル内のフィールド。指定するフィールドは、INT32、INT64、または STRING 型の単一値フィールドまたは複数値フィールドにすることができます。
b: 定数文字列。指定した定数は縦棒 (|
) で区切ります。値が指定された定数のいずれかと一致する場合、この関数は false を返します。
戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値が b 値セットに含まれていないことを示します。false の値は、a フィールドの値が b 値セットに含まれていることを示します。
例
次のステートメントでは、notcontain
関数を使用して、nid フィールドの値が 1、2、または 3 ではない行のデータエントリをクエリします。
SELECT nid, price, brand, size FROM phone WHERE notcontain(nid, '1|2|3') ORDER BY nid LIMIT 100
USE_TIME: 0.092, ROW_COUNT: 7
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
4 | 2999 | OPPO | 5.5 |
5 | 1299 | Meizu | 5.5 |
6 | 169 | Nokia | 1.4 |
7 | 3599 | Apple | 4.7 |
8 | 5998 | Apple | 5.5 |
9 | 4298 | Apple | 4.7 |
10 | 5688 | Samsung | 5.6 |
MATCHINDEX
プロトタイプ
説明
この関数を使用すると、a フィールドの値に b パラメーターの値が含まれているかどうかを判断できます。この関数を使用して、フィールドのインデックスを取得できます。
この関数は、WHERE 句でのみ使用して、インデックス検索フェーズで転置インデックスを最適化できます。
パラメーター
a: STRING 型のフィールド。システムは、指定されたフィールドに基づいて転置インデックスを作成し、クエリを最適化します。
b: STRING 型のキーワード。
b パラメーターの値は、位置インデックスの検索クエリ文字列として使用できます。詳細については、query 句を参照してください。
c: オプション。b パラメーターの値をトークン化するために使用されるアナライザーやストップワードなどの情報を指定できます。
c パラメーターの値には、次のパラメーターを使用できます。パラメーターの詳細については、このトピックの付録セクションを参照してください。
パラメーター名と対応する値の間にコロン (:
) を指定し、複数のパラメーターをコンマ (,
) で区切る必要があります。
global_analyzer
specific_index_analyzer
no_token_indexes
tokenize_query
remove_stopwords
default_op
戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値に b パラメーターの値が含まれていることを示します。false の値は、a フィールドの値に b パラメーターの値が含まれていないことを示します。
例
次のステートメントでは、MATCHINDEX
関数を使用して、title
フィールドの値に Lens キーワードが含まれる行のデータエントリをクエリします。
SELECT nid, brand FROM phone WHERE MATCHINDEX('title', 'Lens')
------------------------------- TABLE INFO ---------------------------
nid | brand |
1 | Huawei |
QUERY
プロトタイプ
boolean QUERY(const string a, const string b)
boolean QUERY(const string a, const string b, const string c)
説明
この関数を使用すると、a フィールドの値に b パラメーターの値が含まれているかどうかを判断できます。システムは、指定されたキーワードを自動的に用語に変換し、クエリを実行します。
この関数は、HA3 でサポートされている SQL ステートメントの query 句の構文をサポートしています。query 句の詳細については、query 句を参照してください。
この関数は、WHERE 句でのみ使用して、インデックス検索フェーズで転置インデックスを最適化できます。
パラメーター
a: STRING 型のフィールド。システムは、指定されたフィールドを config 句の default_index パラメーターの値として自動的に使用します。config 句の詳細については、Config 句を参照してください。
b: STRING 型のキーワード。
システムは、ステートメントを最適化し、指定された範囲からデータをクエリした後、b パラメーターの値をステートメントに含めます。
c: オプション。b パラメーターの値をトークン化するために使用されるアナライザーやストップワードなどの情報を指定できます。
パラメーター名と対応する値の間にコロン (:
) を指定し、複数のパラメーターをコンマ (,) で区切る必要があります。
c パラメーターの値には、次のパラメーターを使用できます。
global_analyzer
specific_index_analyzer
no_token_indexes
tokenize_query
remove_stopwords
default_op
戻り値
この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値に b パラメーターの値が含まれていることを示します。false の値は、a フィールドの値に b パラメーターの値が含まれていないことを示します。
例
次のステートメントでは、
QUERY
関数を使用して、title
フィールドの値に Huawei キーワードが含まれる行のデータエントリをクエリします。
SELECT nid, price, brand, size FROM phone WHERE QUERY('title', 'Huawei')
USE_TIME: 0.034, ROW_COUNT: 1
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
2 | 4388 | Huawei | 5.5 |
次のステートメントでは、Huawei キーワードと OPPO キーワードを使用して、title フィールドの値に Huawei キーワードまたは OPPO キーワードが含まれる行のデータエントリをクエリします。
SELECT nid, price, brand, size FROM phone
WHERE QUERY('title', 'Huawei OR OPPO')
USE_TIME: 0.03, ROW_COUNT: 2
------------------------------- TABLE INFO ---------------------------
nid | price | brand | size |
2 | 4388 | Huawei | 5.5 |
4 | 2999 | OPPO | 5.5 |
次のステートメントでは、default_op パラメーターが c パラメーターの値に含まれています。パラメーター名と対応する値の間にコロン (
:
) を指定し、複数のパラメーターをコンマ (,) で区切ることで、c パラメーターの値に複数のパラメーターを含めることができます。
SELECT nid, price, brand, size FROM phone
WHERE QUERY('title', 'Huawei OPPO', 'default_op:OR,remove_stopwords:true')
使用上の注意
この関数の b パラメーターは、HA3 が提供する query 句の構文パーサーによって解析されます。HA3 でサポートされている query 句の構文の詳細については、query 句を参照してください。b パラメーターを定数文字列に設定し、ステートメントを実行してクエリを実行する場合、定数文字列を一重引用符 (') で囲まないでください。たとえば、ステートメントの query=Huawei OPPO 句は、QUERY 関数の WHERE QUERY ('title', 'Huawei OPPO') 条件と同等です。query 句で論理演算子を使用する場合は、各定数を一重引用符 (') で囲むことができます。たとえば、ステートメントの query='Huawei' AND 'OPPO' 句は、QUERY 関数の WHERE QUERY ('title', 'Huawei' AND 'OPPO') 条件と同等です。
一般的なエラー
エラータイプ | 誤った形式 | 正しい形式 |
関数構文が無効なため、クエリが失敗します。 | QUERY('pidvid','123:456') | QUERY('pidvid','"123:456"') |
sphere_distance
プロトタイプ
double sphere_distance(LOCATION point, double longitude, double latitude)
説明
この関数を使用すると、ドキュメントと、指定された緯度と経度によって決定される場所の間の距離を計算できます。
パラメーター
point: LOCATION 型のフィールド。指定されたフィールドの値は、単一値形式である必要があります。
longitude: 場所の経度。
latitude: 場所の緯度。
戻り値
球面距離。
例
次のステートメントでは、sphere_distance
関数が使用されています。geo フィールドは LOCATION 型の単一値フィールドである必要があります。また、このフィールドに基づいて順方向インデックスが作成されます。
SELECT sphere_distance(geo,127.0,30.0) FROM phone
range
プロトタイプ
boolean range(int8 v, const string rangeDesc)
boolean range(uint8 v, const string rangeDesc)
boolean range(int16 v, const string rangeDesc)
boolean range(uint16 v, const string rangeDesc)
boolean range(int32 v, const string rangeDesc)
boolean range(uint32 v, const string rangeDesc)
boolean range(int64 v, const string rangeDesc)
boolean range(uint64 v, const string rangeDesc)
boolean range(float v, const string rangeDesc)
boolean range(double v, const string rangeDesc)
説明
この関数を使用すると、順方向インデックスに対応する v フィールドの値が、rangeDesc パラメーターで指定された範囲内にあるかどうかを判断できます。
パラメーター
v: クエリするデータが格納されているフィールド。フィールドは単一値フィールドである必要があります。
rangeDesc: 値の範囲。開区間、閉区間、または半開区間を指定できます。
戻り値
次の表に、この関数の例と対応する戻り値を示します。
例 | 戻り値 |
range(v, "[0, 100]") | 0<=v<=100 |
range(v, "(0, 100)") | 0<v<100 |
range(v, "[0, 100)") | 0<=v<100 |
range(v, "(0, 100]") | 0<v<=100 |
range(v, "(0,)") range(v, "(0,]") | 0<v |
range(v, "[0,)") range(v, "[0,]") | 0<=v |
range(v, "(,100)") range(v, "[,100)") | v<100 |
range(v, "(,100]") range(v, "[,100]") | v<=100 |
range(v, "(,)") range(v, "[,]") range(v, "[,)") range(v, "(,]") | true |
rangeDesc パラメーターの値の前に ! を付けると、指定された値の範囲に対して NOT 演算が実行されます。
例
次のステートメントでは、range
関数が使用されています。
SELECT nid FROM phone where range(price,"(127.0,30.0)")
SELECT nid FROM phone where range(price,"!(127.0,30.0)")
normalizescore
プロトタイプ
double normalizescore(int8 v, const string defaultScore)
double normalizescore(uint8 v, const string defaultScore)
double normalizescore(int16 v, const string defaultScore)
double normalizescore(uint16 v, const string defaultScore)
double normalizescore(int32 v, const string defaultScore)
double normalizescore(uint32 v, const string defaultScore)
double normalizescore(int64 v, const string defaultScore)
double normalizescore(uint64 v, const string defaultScore)
double normalizescore(float v, const string defaultScore)
double normalizescore(double v, const string defaultScore)
説明
この関数を使用すると、v フィールドの値を DOUBLE 型の値に正規化できます。値が初期化されている場合、関数は入力値を返します。値が初期化されていない場合、関数は defaultScore パラメーターの値を返します。
パラメーター
v: 正規化するデータが格納されているフィールド。フィールドは単一値フィールドである必要があります。
defaultScore: DOUBLE 型の文字列に変換できる定数文字列。
戻り値
v フィールドの値が初期化されている場合、関数は入力値を返します。v フィールドの値が初期化されていない場合、関数は defaultScore パラメーターの値を返します。
例
次のステートメントでは、normalizescore 関数を使用して、doc1、doc2、および doc3 の price フィールドを正規化します。
doc1: price=1.0
doc2: price= (初期化されていません)
doc3: price=2.0
実行
select normalizescore(price, "1000.0") as normalized_score from phone
USE_TIME: 32.141ms, ROW_COUNT: 2
------------------------------- TABLE INFO ---------------------------
normalized_score(double) |
1.0 |
1000.0 |
2.0. |
付録
アナライザーの設定
MATCHINDEX や QUERY などの関数を使用する場合、次のパラメーターを設定してアナライザーを指定できます。
グローバルアナライザーを指定します。このパラメーターで指定されたアナライザーは、スキーマで指定したアナライザーよりも優先順位が高くなります。指定されたアナライザーは、analyzer.json ファイルに含まれている必要があります。
指定されたフィールドのアナライザーを指定します。このパラメーターで指定されたアナライザーは、global_analyzer パラメーターで指定したアナライザーとスキーマで指定したアナライザーよりも優先順位が高くなります。
システムが用語に変換しないようにするフィールドを指定します。このパラメーターの設定は、正規化やストップワードの削除など、指定されたフィールドの値に対して実行される他の操作には影響しません。
複数のフィールドはセミコロン (;)
で区切ります。
tokenize_query
true
: 検索クエリを用語に変換します。false
: 検索クエリを用語に変換しません。QUERY
UDF を指定するときにアナライザーを設定した場合、このパラメーターは有効になりません。
デフォルト値は true
です。
remove_stopwords
true
: ストップワードを削除します。false
: ストップワードを削除しません。アナライザーを設定するときにストップワードを指定できます。
デフォルト値は true
です。
デフォルトのアナライザーを使用して検索クエリをトークン化した後に返される用語間の論理関係を指定します。有効な値: AND
および OR
。biz を設定するときにデフォルトの演算子を指定できます。biz の設定方法については、biz の設定を参照してください。
サードパーティ製サポート UDF
複雑な関数
関数 | 説明 | バージョン |
型キャスト | 値をあるデータ型から別のデータ型に変換します。 | すべて |