執行子字串搜尋

除了完整符記比對之外,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_minngram_size_max 之間的差異增加時,這種情況就會更加明顯。子字串查詢也會使用更多執行資源。

如同 TOKENIZE_FULLTEXT,您可以設定 TOKENIZE_SUBSTRING 使用特定類型的內容。

除了基本子字串搜尋外,SEARCH_SUBSTRING 也支援相對搜尋模式。相對搜尋可精進子字串搜尋結果。

如要啟用相對搜尋模式,請將 TOKENIZE_SUBSTRINGrelative_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 困擾

後續步驟