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_min
と ngram_size_max
の差が大きくなるほど顕著になります。また、部分文字列クエリは実行に多くのリソースを使用します。
TOKENIZE_FULLTEXT
と同様に、特定の種類のコンテンツを使用するように TOKENIZE_SUBSTRING
を構成できます。
相対部分文字列検索を有効にする
SEARCH_SUBSTRING
は、基本的な部分文字列検索に加えて、相対検索モードもサポートしています。相対検索は、部分文字列検索の結果を絞り込みます。
相対検索モードを有効にするには、TOKENIZE_SUBSTRING
の relative_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 いいえ
次のステップ
- 全文検索クエリについて確認する。
- 検索結果をランク付けする方法を確認する。
- 検索結果をページ分けする方法を確認する。
- 全文クエリと非テキストクエリを組み合わせる方法を確認する。
- 複数の列を検索する方法を確認する。