すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:UDF の概要

最終更新日:Jun 19, 2026

OpenSearch には、フィールドマッチング、インデックス検索、値マッピング、範囲チェック、スコア正規化のための組み込みユーザー定義関数 (UDF) が用意されています。

UDF リスト

関数名

説明

contain

フィールド値が指定されたコレクションに含まれているかどうかをチェックします。単一値と複数値に対応しています。

notcontain

フィールド値が指定されたコレクションに含まれていないかどうかをチェックします。単一値と複数値に対応しています。

MATCHINDEX

指定された条件を使用して、指定されたフィールドの転置インデックスをクエリします。

QUERY

指定された条件で転置インデックスをクエリします。ネイティブの HA3 クエリ構文を使用します。

hashcombine

複数の int64 値を 1 つの int64 値にマージします。

rangevalue

連続値を離散値にマッピングします。

range

フィールド値が指定された区間内にあるかどうかをチェックします。

normalizescore

フィールド値を正規化します。

検索の例

テーブル全体の検索

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(INT a, const string b)
    boolean contain(LITERAL a, const string b)
    boolean contain(INT_ARRAY a, const string b)
    boolean contain(LITERAL_ARRAY a, const string b)
  • 説明

パラメータ a がパラメータ b で指定された内容を含んでいるかどうかをチェックします。

  • パラメータ

    パラメータ a:入力パラメータです。INT、LITERAL、INT_ARRAY、および LITERAL_ARRAY のデータ型に対応しています。

    パラメータ b:定数文字列式です。複数の値を区切るには縦棒 (|) を使用できます。いずれかの値が一致すると、関数は true を返します。

  • 戻り値

    パラメータ a がパラメータ b で指定されたコレクションを含んでいるかどうかを示すブール値を返します。

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(INT a, const string b)
    boolean notcontain(LITERAL a, const string b)
    boolean notcontain(INT_ARRAY a, const string b)
    boolean notcontain(LITERAL_ARRAY a, const string b)
  • 説明

    パラメータ a がパラメータ b で指定された内容をいないかどうかをチェックします。

  • パラメータ

    パラメータ a:入力パラメータです。INT、LITERAL、INT_ARRAY、および LITERAL_ARRAY のデータ型に対応しています。

    パラメータ b:定数文字列式です。複数の値を区切るには縦棒 (|) を使用できます。いずれの値も一致しない場合、関数は true を返します。

  • 戻り値

    パラメータ 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

  • プロトタイプ

    boolean MATCHINDEX(const string a, const string b)
  • 説明

    フィールド a が b で指定された内容を 含んでいる かどうかをチェックします。この関数は、単一フィールドのインデックス検索に使用されます。

    インデックスの検索フェーズにおける転置インデックスの高速化と最適化にのみ使用されます。WHERE 句で使用できます。

  • パラメータ

    パラメータ a:最適化のために転置インデックスが作成されたフィールドを指定する定数文字列です。

    パラメータ b:検索する内容を指定する定数文字列です。

パラメータ b の値は、単一の文字列として検索されます。

  • 戻り値

    フィールド a がパラメータ b で指定された内容を 含んでいる かどうかを示すブール値を返します。

  • MATCHINDEX 関数を使用して、転置インデックスフィールド title がキーワード「camera」を含むレコードを検索します。

    SELECT nid, brand FROM phone WHERE MATCHINDEX('title', 'camera')
    ------------------------------- TABLE INFO ---------------------------
                     nid |               brand |
                       1 |              Huawei |

QUERY

  • プロトタイプ

    boolean QUERY(const string a, const string b)
  • 説明

    フィールド a が b で指定された内容を 含んでいる かどうかをチェックします。この関数は、自動トークン化および検索機能を提供します。

    この関数を使用すると、SQL モードでネイティブの HA3 クエリ構文を使用できます。

    インデックスの検索フェーズにおける転置インデックスの高速化と最適化にのみ使用されます。WHERE 句で使用できます。

  • パラメータ

    パラメータ a:デフォルトのインデックスフィールドを指定する定数文字列です。

    パラメータ b:クエリ式を提供する定数文字列です。

このパラメータはクエリパーサーによって解析され、範囲インデックスに対応しています。

  • 戻り値

    フィールド a がパラメータ b で指定された内容を 含んでいる かどうかを示すブール値を返します。

  • QUERY 関数を使用して、title フィールドに「Huawei phone」が含まれるアイテムをクエリします。

  • SELECT nid, price, brand, size FROM phone WHERE QUERY(title, 'Huawei phone')
    USE_TIME: 0.034, ROW_COUNT: 1
    
    ------------------------------- TABLE INFO ---------------------------
                     nid |               price |               brand |                size |
                       2 |                4388 |              Huawei |                 5.5 |
  • 結合条件を使用して、title フィールドに「Huawei phone」または「OPPO phone」が含まれるアイテムを検索します。

  • SELECT nid, price, brand, size FROM phone 
       WHERE QUERY(title, 'Huawei phone OR OPPO phone')
    USE_TIME: 0.03, ROW_COUNT: 2
    
    ------------------------------- TABLE INFO ---------------------------
                     nid |               price |               brand |                size |
                       2 |                4388 |              Huawei |                 5.5 |
                       4 |                2999 |                OPPO |                 5.5 |
  • 注:

    QUERY UDF の 2 番目のパラメータは、HA3 のクエリパーサーによって解析されます。2 番目のパラメータが定数文字列の場合、文字列が HA3 クエリパーサーに渡される前に、囲んでいる一重引用符が削除されます。たとえば、QUERY(title, 'Huawei phone OPPO phone') は、HA3 クエリ query=Huawei phone OPPO phone と同等です。HA3 クエリ文字列 query='Huawei phone' AND 'OPPO phone' のようにクエリに引用符を含めるには、QUERY(title, '''Huawei phone'' AND ''OPPO phone''') という式を使用します。SQL ステートメントの定数文字列の詳細については、制限事項の「定数文字列」セクションをご参照ください。

  • よくあるエラー:

  • エラータイプ

    誤った形式

    正しい形式

    構文エラー。クエリは結果を返しません。

    QUERY('pidvid','123:456')

    QUERY('pidvid','"123:456"')

rangevalue

  • プロトタイプ

    float rangevalue(float v, string desc)
  • 説明

連続値を離散値にマッピングします。

  • パラメータ

    パラメータ v:連続値を含む列です。

    パラメータ desc:マッピングルールです。

  • 戻り値

    マッピングされた離散値。

  • rangevalue 関数を使用して、price フィールドの値をマッピングします。1000 以下の値は 1.0 にマッピングされます。1000 より大きく 5000 以下の値は 2.0 にマッピングされます。その他の値はマッピングされず、元の値が保持されます。

    SELECT rangevalue(price,'(,1000]:1.0;(1000,5000]:2.0') FROM phone;

range

  • プロトタイプ

    boolean range(INT 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 パラメータでは、文字列の先頭に感嘆符 (!) を付けて、指定された区間を否定することもできます。

  • range 関数を使用します:

    SELECT nid FROM phone where range(price,"(30.0,127.0)")
    SELECT nid FROM phone where range(price,"!(30.0,127.0)")

    注: range は SQL の予約語であるため、エスケープする必要があります。

normalizescore

  • プロトタイプ

    double normalizescore(INT v, const double defaultScore)
    double normalizescore(FLOAT v, const double defaultScore)
    double normalizescore(DOUBLE v, const double defaultScore)
  • 説明

入力フィールド v の値を double データ型に正規化します。フィールドが初期化されていない場合は、デフォルトスコアが使用されます。

  • パラメータ

    パラメータ v:フィールドです。単一値の数値型に対応しています。

    パラメータ defaultScore:デフォルトスコアを指定する定数です。有効な double 値に変換できる文字列である必要があります。

  • 戻り値

    フィールド v が初期化されている場合は、v の元の値を返します。それ以外の場合は、defaultScore の値を返します。

`price` フィールドを持つ 3 つのドキュメントの元の内容は次のとおりです:
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: 3

------------------------------- TABLE INFO ---------------------------
          normalized_score(double) |
                            1.0    |
                            1000.0 |
                            2.0    |