執行子字串搜尋

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

後續步驟