除了完整符記比對之外,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 over Troubled Water | bri trou ter | 是 |
Bridge over Troubled Water | 橋 | 是 |
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);
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-grams,並將這些 n-grams 儲存在搜尋索引。要產生的 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 Troubled Water 橋樑 否 Bridge over Troubled Water brid over 否 Bridge over Troubled Water 解決問題 是 Bridge over Troubled Water 橋梁過於狹窄 否 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 山脊 否 Bridge over Troubled Water 混亂的局勢 否 value_suffix
:比對相鄰的子字串,且必須在值的結尾進行比對。這個概念與ENDS_WITH
函式類似,後者可將大小寫和空白字元標準化的字串。範例
已儲存的文字 子字串查詢。 比對 Bridge over Troubled Water 混亂的局勢 是 Bridge over Troubled Water 混濁的水 是 Bridge over Troubled Water 混濁的水 是 Bridge over Troubled Water 有問題的水 否 Bridge over Troubled Water 水質不佳 否 Bridge over Troubled Water 橋樑 否 word_prefix:
與value_prefix
類似,但字串必須在字詞邊界 (而非值邊界) 上相符。範例
已儲存的文字 子字串查詢 比對 Bridge over Troubled Water 解決問題 是 Bridge over Troubled Water 通話完畢,發生問題 是 Bridge over Troubled Water 水管問題 否 Bridge over Troubled Water 水上 否 Bridge over Troubled Water ove 困擾 否 Bridge over Troubled Water 版本有問題 是 word_suffix
:類似value_suffix
,但字串必須在詞彙邊界結尾處相符。範例
已儲存的文字 子字串查詢 比對 Bridge over Troubled Water 版本有問題 是 Bridge over Troubled Water 解決問題 否 Bridge over Troubled Water 水上 否 Bridge over Troubled Water ove 困擾 否
後續步驟
- 瞭解全文搜尋查詢。
- 瞭解如何排序搜尋結果。
- 瞭解如何分頁顯示搜尋結果。
- 瞭解如何混合全文查詢和非文字查詢。
- 瞭解如何搜尋多個欄。