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_min
と ngram_size_max
の差が大きくなるほど顕著になります。また、サブストリング クエリは実行に多くのリソースを使用します。
TOKENIZE_FULLTEXT
と同様に、特定の種類のコンテンツを使用するように TOKENIZE_SUBSTRING
を構成できます。
相対部分文字列検索を有効にする
SEARCH_SUBSTRING
は、基本的な部分文字列検索に加えて、相対検索モードもサポートしています。相対検索は、部分文字列検索の結果を絞り込みます。
相対検索モードを有効にするには、TOKENIZE_SUBSTRING
relative_search_types
パラメータを TRUE に設定します。
トークン化で相対検索が有効になっている場合、SEARCH_SUBSTRING
は次の相対検索タイプを使用してクエリを実行できます。
phrase
: 連続する部分文字列を照合します。例
保存されたテキスト 部分文字列クエリ。 一致 Bridge over Troubled Water 架橋 ○ 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 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 ×
次のステップ
- 全文検索クエリについて学習する。
- 検索結果をランク付けする方法を確認する。
- 検索結果をページ分けする方法を学習する。
- 全文クエリと非テキストクエリを組み合わせる方法を学習する。
- 複数の列を検索する方法について学ぶ。