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

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 ブリッジの上
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 関数を使用します。

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

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

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

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

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

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

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

相対検索モードを有効にするには、TOKENIZE_SUBSTRING relative_search_types パラメータを TRUE に設定します。

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

  • value_prefix: 連続するサブ文字列と一致します。一致は値の先頭から開始する必要があります。これは、大文字と空白文字を正規化した文字列の STARTS_WITH 関数と概念的に似ています。

    保存されたテキスト 部分文字列クエリ 一致
    Bridge over Troubled Water 架橋
    Bridge over Troubled Water 架橋
    Bridge over Troubled Water リッジオーバー ×
    Bridge over Troubled Water 混乱した状況 ×
  • value_suffix: 連続するサブ文字列と一致します。一致は値の末尾でする必要があります。これは、大文字と空白文字を正規化した文字列の ENDS_WITH 関数と概念的に似ています。

    保存されたテキスト 部分文字列クエリ。 一致
    Bridge over Troubled Water troubled water
    Bridge over Troubled Water 混乱
    Bridge over Troubled Water roubled water
    Bridge over Troubled Water troubled wate ×
    Bridge over Troubled Water trouble water ×
    Bridge over Troubled Water 架橋 ×
  • value_prefix と同様に word_prefix: ですが、文字列は値の境界ではなく、語句の境界で一致する必要があります。

    保存されたテキスト 部分文字列クエリ 一致
    Bridge over Troubled Water トラブルが発生した場合
    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 トラブルが発生した場合 ×
    Bridge over Troubled Water over water ×
    Bridge over Troubled Water ove troubled ×

次のステップ