除了完全比對權杖外,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 | 否 |
如要搜尋子字串,請在 TOKENLIST 資料欄定義中使用 TOKENIZE_SUBSTRING 函式,如下列 DDL 範例所示:
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsTitleIndex ON Albums(AlbumTitle_Tokens);
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));
CREATE SEARCH INDEX albumstitleindex ON albums(albumtitle_tokens);
在 SQL 查詢中,於 WHERE 子句中使用 SEARCH_SUBSTRING 函式。舉例來說,下列查詢會比對先前範例中建立的資料表,找出名稱為「happy」的專輯:
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');
PostgreSQL
本範例使用 spanner.search_substring。
SELECT albumid
FROM albums
WHERE spanner.search_substring(albumtitle_tokens, 'happ');
TOKENIZE_SUBSTRING 會為每個權杖產生 n-grams,並將這些 n-grams 儲存在搜尋索引中。可透過選用引數設定要產生的 n 元語法長度下限和上限。
與相同資料的全文檢索索引相比,子字串搜尋索引的儲存空間用量可能會多出 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 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 橋梁水 否 value_prefix:比對連續子字串,且比對必須從值開頭開始。這在概念上與大小寫和空白字元正規化字串的STARTS_WITH函式類似。範例
儲存的文字 子字串查詢 比對 Bridge over Troubled Water 橋接 是 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 橋接 否 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 水上 否 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 水上 否 Bridge over Troubled Water ove troubled 否
後續步驟
- 瞭解全文搜尋查詢。
- 瞭解如何排序搜尋結果。
- 瞭解如何將搜尋結果分頁。
- 瞭解如何混合使用全文和非文字查詢。
- 瞭解如何搜尋多個資料欄。