部分文字列検索を実行する

Spanner の検索インデックスは、トークンの完全一致に加えて、部分文字列検索もサポートしています。このページでは、Spanner で全文検索の一部として部分文字列検索を実行する方法について説明します。

部分文字列検索には次の特徴があります。

  • 大文字と小文字が区別されず、ほとんどの句読点が破棄され、空白文字が正規化されます。
  • 中国語、日本語、韓国語(CJK)のセグメント化は行われません。CJK の部分クエリでは、多くの場合、誤ってセグメント化されるためです。
  • 複数の検索語句の場合は、各語句の部分文字列が結果に含まれている必要があります。たとえば、'happ momen'"happy moment" と一致します。これは、両方の部分文字列がテキスト内にあるためです。これは "happy day" と一致しません。

保存されたテキスト 部分文字列クエリ 一致
Bridge over Troubled Water ridg roub はい
Bridge over Troubled Water ridg , roub はい
Bridge over Troubled Water over brid はい
Bridge over Troubled Water ate bridge はい
Bridge over Troubled Water Bridge bridge bridge はい
Bridge over Troubled Water bri trou ter はい
Bridge over Troubled Water bri dge はい
Bridge over Troubled Water troubledwater いいえ
Bridge over Troubled Water trubled いいえ

部分文字列検索の場合は、次の DDL の例に示すように、TOKENLIST 列定義で TOKENIZE_SUBSTRING 関数を使用します。

GoogleSQL

CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

PostgreSQL

この例では spanner.tokenize_substring を使用しています。

CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
    GENERATED ALWAYS AS (spanner.tokenize_substring(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

SQL クエリで、WHERE 句に SEARCH_SUBSTRING 関数を使用します。たとえば、次のクエリは、前の例で作成したテーブルでタイトルが「happy」のアルバムに一致します。

GoogleSQL

SELECT Album
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');

PostgreSQL

この例では spanner.search_substring を使用しています。

SELECT album
FROM albums
WHERE spanner.search_substring(albumtitle_tokens, 'happ');

TOKENIZE_SUBSTRING は、トークンごとに n-gram を生成し、これらの n-gram を検索インデックスに保存します。生成する n-gram の最小長と最大長は、オプションの引数で構成します。

トークン化により生成されるトークンが非常に多いため、部分文字列検索インデックスでは、同じデータに対して全文検索インデックスよりも 10~30 倍のストレージを使用する場合があります。これは、ngram_size_minngram_size_max の差が大きくなるほど顕著になります。また、部分文字列クエリは実行に多くのリソースを使用します。

TOKENIZE_FULLTEXT と同様に、特定の種類のコンテンツを使用するように TOKENIZE_SUBSTRING を構成できます。

SEARCH_SUBSTRING は、基本的な部分文字列検索に加えて、相対検索モードもサポートしています。相対検索は、部分文字列検索の結果を絞り込みます。

相対検索モードを有効にするには、TOKENIZE_SUBSTRINGrelative_search_types パラメータを、サポートされている相対検索タイプの要素を含む空でない配列に設定します。

トークン化で相対検索が有効になっている場合、SEARCH_SUBSTRING は次の相対検索タイプでクエリを実行できます。

  • phrase: 連続する部分文字列を照合します。

    保存されたテキスト 部分文字列クエリ。 一致
    Bridge over Troubled Water bridge over はい
    Bridge over Troubled Water Bridge bridge bridge いいえ
    Bridge over Troubled Water brid over いいえ
    Bridge over Troubled Water ridge over trouble はい
    Bridge over Troubled Water bridge ove troubled いいえ
    Bridge over Troubled Water idge ove はい
    Bridge over Troubled Water idge , ove はい
    Bridge over Troubled Water RIDGE OVE はい
    Bridge over Troubled Water bridge water いいえ
  • value_prefix: 連続する部分文字列と一致します。一致は値の先頭から開始する必要があります。これは、大文字と空白文字を正規化した文字列の STARTS_WITH 関数と概念的に似ています。

    保存されたテキスト 部分文字列クエリ 一致
    Bridge over Troubled Water bridge over はい
    Bridge over Troubled Water bridge , over はい
    Bridge over Troubled Water ridge over いいえ
    Bridge over Troubled Water troubled water いいえ
  • value_suffix: 連続する部分文字列と一致します。一致は値の末尾で一致する必要があります。これは、大文字と空白文字を正規化した文字列の ENDS_WITH 関数と概念的に似ています。

    保存されたテキスト 部分文字列クエリ。 一致
    Bridge over Troubled Water troubled water はい
    Bridge over Troubled Water troubled ; water はい
    Bridge over Troubled Water roubled water はい
    Bridge over Troubled Water troubled wate いいえ
    Bridge over Troubled Water trouble water いいえ
    Bridge over Troubled Water bridge over いいえ
  • word_prefix:: value_prefix と似ていますが、文字列は値の境界ではなく、語句の境界で一致する必要があります。

    保存されたテキスト 部分文字列クエリ 一致
    Bridge over Troubled Water over trouble はい
    Bridge over Troubled Water Over , trouble はい
    Bridge over Troubled Water troub water いいえ
    Bridge over Troubled Water over water いいえ
    Bridge over Troubled Water ove troubled いいえ
    Bridge over Troubled Water ver troubled はい
  • word_suffix: value_suffix に似ていますが、文字列は語境の末尾で一致する必要があります。

    保存されたテキスト 部分文字列クエリ 一致
    Bridge over Troubled Water ver troubled はい
    Bridge over Troubled Water over trouble いいえ
    Bridge over Troubled Water over water いいえ
    Bridge over Troubled Water ove troubled いいえ

次のステップ