執行子字串搜尋

除了完全比對權杖外,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_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 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

後續步驟