Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

%CONTAINS

単語認識マッチングを使用して、値を 1 つ以上の語句とマッチングします。

Synopsis

scalar-expression %CONTAINS(word[,word...])

引数

scalar-expression その値を 1 つ以上の word 文字列と比較するスカラ式 (通常はデータ列)。データ型は %Text である必要があります。
word scalar-expression の値と一致するアルファベット文字列、またはアルファベット文字列のコンマ区切りリスト。word は完全な単語、または複数の完全な単語から構成される句にする必要があります。単語または句は一重引用符で区切る必要があります。

概要

%CONTAINS 述語により、word で指定する 1 つ以上の文字列と一致するデータの値を選択できます。この比較演算は、単なる文字列一致演算でなく、単語を認識します。複数の word を指定すると、scalar-expression には指定したすべての単語の文字列が含まれる必要があります。単語の文字列の出現順は問われません。word がスカラ式のいずれのデータの値とも一致しない場合、%CONTAINS は NULL 文字列を返します。

%CONTAINS はコレクション述語です。これは SELECT 文の WHERE 節内でのみ使用できます。%CONTAINS を、JOIN 操作用のフィールドを選択する述語として使用することはできません。

%CONTAINS は %Text 文字列または文字ストリーム・フィールドで使用できます。

文字列に%CONTAINS を使用するには、%String プロパティを %Text に変更して、LANGUAGECLASS および MAXLEN プロパティ・パラメータを設定します。以下に例を示します。

Property MySentences As %Text(LANGUAGECLASS = "%Text.English",MAXLEN = 1000);

%TextOpens in a new tab プロパティには MAXLEN 値 (バイト) を指定する必要があります。

%CONTAINS を使用して文字ストリーム・フィールドを検索するには、ストリーム・フィールドが %Stream.GlobalCharacterSearchable タイプとして定義されていることが必要です。以下に例を示します。

Property MyTextStream As %Stream.GlobalCharacterSearchable(LANGUAGECLASS = "%Text.English");

%CONTAINS 述語は、WHERE 節のストリーム・フィールドで使用可能な述語の 1 つです。

使用できる言語は、英語、フランス語、ドイツ語、イタリア語、日本語、ポルトガル語、およびスペイン語です。詳細は、"インターシステムズ・クラス・リファレンス" の (%SYS の) %TextOpens in a new tab パッケージ・クラスのドキュメントを参照してください。

scalar-expression が %Text と %Stream.GlobalCharacterSearchable のいずれのデータ型でもない場合、システムは SQLCODE -309 エラーを生成します。

scalar-expression がコレクション値フィールド (プロパティ) でない場合は、システムは SQLCODE -472 エラーを生成します。

単語認識マッチング

word は必ず完全な単語、または単語の並びにする必要があります。word 引数が単一の単語の場合、指定された単語のみが一致するように、句読点解析および語幹ルールを含めた言語解析ルールが使用されます。例えば、word 引数の “set” は、“set” または “Set” (大文字と小文字の区別なし)、および “sets” および “setting” などの語幹形式と一致します。ただし、その単語に指定された文字列が含まれていても、“setscrew”、“settle”、または “Seth” などの単語とは一致しません

語幹ルールは、任意の 2 つの語幹の形式間におけるマッチングを規定します。語幹解析は、検索語と検索対象テキストの両方に対して実行されます。例えば、%CONTAINS('jumping') と指定すると、テキスト内の単語 “jumps” と一致します。

この単語認識マッチングは、SQL 包含関係演算子 ([) により実行される文字ごとの文字列マッチングとは根本的に異なります。

複数語句

%CONTAINS キーワード演算子では、'United States of America' などの複数語の word を検索できます。これらの検索の実行方法は、クラスの NGRAMLEN プロパティの設定により異なります。既定では NGRAMLEN=1 です。これは、word 引数に含まれる語数にかかわらず、%CONTAINS でこれを単一の単語として処理することを意味します。

NGRAMLEN が word 句の語数以上の場合、句は単語認識テストとして処理されます。つまり、比較は大文字と小文字が区別されず、単語ごとに行われます。そのため、'School of Art' は 'School of Art' や 'school of art' とは一致しますが、'School of Arthur Murray' とは一致しません。

NGRAMLEN が word 句の語数より小さい場合、Caché は LANGUAGECLASS のディクショナリを参照して、長さが NGRAMLEN (またはそれよりも小さい) で出現頻度が最も少ない語を選択します。例えば、NGRAMLEN=2 の場合は、myDoc %CONTAINS('big black dog') などの述語を使用できます。この場合、長さが NGRAMLEN で頻出頻度が最も少ない語は 'big black' になります。続いて Caché は、myDoc プロパティを取得し (通常は、マスタ・マップから)、クエリ・パターンの語幹解析後の表現が myDoc の語幹解析後の表現に出現したかどうかを判断するためにドキュメントを再解析します。この再解析にはコストが高くつきます。日本語の場合、大小文字変換を必要としないため、%CONTAINS で実行される一部の後処理は不要なオーバーヘッドになります。

包含関係解析

%CONTAINS マッチングは、%SYS ネームスペースにある %Text.TextOpens in a new tab システム・クラスのクラス・パラメータで規定されます。これらのパラメータは、比較で大文字と小文字を区別するかどうか、および数字、句読点文字、複数語句の処理方法を指定します。

Caché では、一般の単語解析 (“ノイズ語” リスト) や語幹ルールを含む、特別な言語解析ルールを使用して類似性を決定することができます。使用できる言語は、英語、フランス語、ドイツ語、イタリア語、日本語、ポルトガル語、およびスペイン語です。

%CONTAINS および %Text の処理の詳細は、"インターシステムズ・クラス・リファレンス" の %TextOpens in a new tab パッケージ・クラスのドキュメントを参照してください。

%CONTAINS および %CONTAINSTERM

%CONTAINS および %CONTAINSTERM 述語は、指定された word 引数に対して同じ単語認識比較を実行します。これらの演算子の違いは、複数語句に対する要件にあります。

  • %CONTAINSTERM 引数には、ノイズ語を含めることはできません。%CONTAINS 引数には、ノイズ語を含めることができます。

%CONTAINSTERM 演算子は、特定のタイプの比較 (具体的には、非常に多くの検索セット) で優れたパフォーマンスを実現します。%CONTAINSTERM は日本語で比較を実行する場合に推奨されます。

CASEINSENSITIVE クラス・プロパティが指定されている場合を除いて、%CONTAINS 比較では大文字と小文字が区別されます。%CONTAINSTERM 比較では、scalar-expression に対して定義された照合タイプが使用されます。既定では、文字列データ型フィールドは大文字と小文字が区別されない SQLUPPER 照合で定義されます。現在のネームスペースにおける既定の文字列の照合の定義およびフィールド/プロパティの定義における既定以外のフィールドの照合タイプの指定の詳細は、"Caché SQL の使用法" の “照合” の章を参照してください。%CONTAINSTERM ではフィールド照合タイプが使用されるため、CASEINSENSITIVE クラス・プロパティを %CONTAINSTERM 比較に適用できません。オプションで照合を %EXACT に設定すると、大文字と小文字を区別できます。

ストリーム・フィールドとして表されるテキストの検索で %CONTAINS を使用する場合、語幹抽出され、ノイズワードがフィルタされたテキストは文字列に変換する必要があります。%CONTAINSTERM にはストリームのサイズに対する制限がないため、このようなストリームが文字列の最大長よりも長くなる場合は、アプリケーションで %CONTAINS の代わりに %CONTAINSTERM を使用する必要があります。文字列の最大長の詳細は、"Caché プログラミング入門ガイド" の “サーバ構成オプション” の章にある “長い文字列演算のサポート” のセクションを参照してください。

詳細は、"%CONTAINSTERM" 述語を参照してください。

コレクション述語

%CONTAINS はコレクション述語です。これは、述語条件を指定できるコンテキストのほとんどで使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。これは以下の制限に従います。

  • %CONTAINS は、HAVING 節では使用できません。

  • %CONTAINS は、JOIN 操作用のフィールドを選択する述語として使用することはできません。

  • OR 論理演算子を使用して %CONTAINS を別の述語条件に関連付けることは、2 つの述語が異なるテーブル内のフィールドを参照している場合はできません。例えば、以下のような場合です。

    WHERE t1.text %CONTAINS('Continental United States') OR t2.Timezone BETWEEN 5 AND 8 
    

    この制限はオプティマイザがインデックスを使用する方法に依存するので、SQL はこの制限を、インデックスがテーブルに追加されるときにのみ適用できます。このタイプの論理は、すべてのクエリで使用しないことを強くお勧めします。

iKnow と iFind

Caché iKnow テキスト解析ツールおよびiFind テキスト検索ツールも、単語認識解析を提供します。これらの機能は %TextOpens in a new tab クラスからは完全に独立しています。これらは他のテキスト解析とは大きく異なる、はるかに高度なのテキスト解析を提供します。

以下の埋め込み SQL の例は、リテラル句を使用して %CONTAINS 比較を実行します。

  &sql(SELECT name,stats
       INTO :badname, :badstat
       FROM Sample.Employee
       WHERE status %CONTAINS('an invalid value'))

以下の埋め込み SQL の例は、ホスト変数を使用して %CONTAINS 比較を実行します。

  SET text="invalid"
  &sql(SELECT name,stats
       INTO :badname, :badstat
       FROM Sample.Employee
       WHERE status %CONTAINS(:text))

その他の等値比較

文字列比較演算子を使用して、その他のタイプの等値比較を実行できます。これは、以下の項目が含まれます。

  • %STARTSWITH を使用した文字列の先頭文字 (列) の等値比較。

  • 等記号を使用した文字列全体の等値比較。

    SELECT Name,Home_State FROM Sample.Person
    WHERE Home_State = 'VT'

    この例では、Home_State フィールドの値が “VT” のレコードがすべて選択されます。既定では、この文字列比較では大文字と小文字が区別されません。

  • 不等記号を使用した文字列全体の不等値比較。

    SELECT Name,Home_State FROM Sample.Person
    WHERE Home_State <> 'MA'
    ORDER BY Home_State

    この例では、Home_State フィールドの値が “MA” と等しくないレコードがすべて選択されます。既定では、この文字列比較では大文字と小文字が区別されません。

  • IN キーワード演算子を使用した、文字列全体の複数の値との等値比較。

    SELECT Name,Home_State FROM Sample.Person
    WHERE Home_State IN ('VT','MA','NH','ME')
    ORDER BY Home_State

    この例では、指定された Home_State フィールドのいずれかの値をとるレコードがすべて選択されます。既定では、この文字列比較では大文字と小文字が区別されません。

  • %PATTERN キーワード演算子を使用した、文字列全体の値のパターンとの等値比較。

    SELECT Name,Home_State FROM Sample.Person
    WHERE Home_State %PATTERN '1U1"C"'
    ORDER BY Home_State

    この例では、1U (1 文字の大文字) の後に 1"C" (1 文字のリテラル文字 “C”) が続くパターンと一致する Home_State フィールドの値を含むすべてのレコードが選択されます。このパターンは、Home_State の省略形が “NC” や “SC” などの場合、満たされます。

  • 包含関係演算子を使用した、部分文字列と値との等値比較。

    SELECT Name FROM Sample.Person
    WHERE Name [ 'y'

    この例では、小文字の “y” が含まれる Name フィールドのレコードがすべて選択されます。既定では、この文字列比較は大文字と小文字が区別されます

  • LIKE キーワード演算子を使用した、1 つ以上のワイルドカードを含む部分文字列と値との等値比較。

    SELECT Name FROM Sample.Person
    WHERE Name LIKE '_a%'

    この例では、2 文字目に小文字の “a” が含まれる Name フィールドのレコードがすべて選択されます。この文字列比較では、Name 照合タイプによって、比較で大文字と小文字が区別されるかどうかが決定されます。

これらの詳細とその他の比較条件の述語については、"WHERE" 節を参照してください。

関連項目

FeedbackOpens in a new tab