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

OpenSearch:概要

最終更新日:Dec 28, 2024

このトピックでは、ユーザー定義関数 (UDF) について説明します。

UDF

関数

説明

contain

指定されたフィールドの特定の値が指定された値セットに含まれている場合、true を返します。フィールドは単値フィールドまたは複数値フィールドを指定できます。

notcontain

指定されたフィールドの特定の値が指定された値セットから除外されている場合、true を返します。フィールドは単値フィールドまたは複数値フィールドを指定できます。

MATCHINDEX

指定されたフィールドの転置インデックスが指定された条件を満たす場合、true を返します。

QUERY

指定された条件に基づいて転置インデックスを返します。この関数の構文は、HA3 でサポートされている query 句の構文と同じです。

hashcombine

INT64 型の複数のフィールドの値を INT64 型の 1 つの値にマージします。

rangevalue

フィールド内の指定された範囲の値を指定されたデータ型の値に変換します。

range

指定されたフィールドの特定の値が指定された範囲に含まれている場合、true を返します。

normalizescore

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

サンプルクエリ

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(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 フィールドは、単値フィールドまたは複数値フィールドです。

  • パラメータ:

    a: データテーブルのフィールドを指定します。指定するフィールドは、INT、LITERAL、INT_ARRAY、または LITERAL_ARRAY 型のフィールドです。

    b: 定数文字列を指定します。指定する定数は縦棒 (|) で区切ります。値が指定された定数のいずれかと一致する場合、この関数は true を返します。

  • 戻り値

    この関数は BOOLEAN 型の値を返します。true の値は、a フィールドの値が b 値セットに含まれていることを示します。false の値は、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: 定数文字列を指定します。指定する定数は縦棒 (|) で区切ります。値が指定された定数のいずれかと一致する場合、この関数は 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

  • プロトタイプ

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

    この関数を使用すると、a フィールドの値に b パラメータの値が含まれているかどうかを判断できます。この関数を使用して、フィールドのインデックスを取得できます。

    この関数は WHERE 句でのみ使用して、インデックス検索フェーズで転置インデックスを最適化できます。

  • パラメータ:

    a: STRING 型のフィールドを指定します。システムは、指定されたフィールドに基づいて転置インデックスを作成し、クエリを最適化します。

    b: STRING 型のキーワードを指定します。

b パラメータの値は、検索クエリ文字列として使用できます。

  • 戻り値

    この関数は 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)
  • 説明

    この関数を使用すると、a フィールドの値に b パラメータの値が含まれているかどうかを判断できます。システムは、指定されたキーワードを自動的に用語に変換してクエリを実行します。

    この関数は、HA3 でサポートされている SQL ステートメントの query 句の構文をサポートしています。

    この関数は WHERE 句でのみ使用して、インデックス検索フェーズで転置インデックスを最適化できます。

  • パラメータ:

    a: STRING 型のフィールドを指定します。システムは、指定されたフィールドを config 句の default_index パラメータの値として自動的に使用します。

    b: STRING 型のキーワードを指定します。

システムは、ステートメントを最適化し、指定された範囲からデータをクエリした後、b パラメータの値をステートメントに含めます。

  • 戻り値

    この関数は 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 |
  • 注:

  • この関数の b パラメータは、HA3 によって提供される query 句の構文パーサーによって解析されます。b パラメータを定数文字列に設定し、ステートメントを実行してクエリを実行する場合、定数文字列を一重引用符 (') で囲まないでください。たとえば、ステートメントの query=Huawei OPPO 句は、QUERY 関数の WHERE QUERY ('title', 'Huawei OPPO') 条件と同じです。query 句で論理演算子を使用する場合は、各定数を一重引用符 (') で囲むことができます。たとえば、ステートメントの query='Huawei' AND 'OPPO' 句は、QUERY 関数の WHERE QUERY ('title', 'Huawei' AND 'OPPO') 条件と同じです。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,"(127.0,30.0)")
    SELECT nid FROM phone where range(price,"!(127.0,30.0)")

normalizescore

  • プロトタイプ

    double normalizescore(INT v, const double defaultScore)
    double normalizescore(FLOAT v, const double defaultScore)
    double normalizescore(DOUBLE v, const double 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.   |