搜尋索引可為多個權杖化資料欄建立索引,提高這些資料欄的查詢效率。本頁面說明如何對多個資料欄執行搜尋,這是一種全文搜尋。
執行多欄搜尋
搜尋索引的結構可確保查詢不需要分散式聯結,因此查詢效能可預測。由於與基本資料表資料列對應的所有權杖都位於同一個分割區,因此系統會避免分散式聯結。
舉例來說,請參考下列結構定義:
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
studio character varying,
title_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,
studio_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,
) PRIMARY KEY(albumid);
CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);
查詢現在可以搜尋兩個欄位:Title_Tokens 和 Studio_Tokens。
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'fifth symphony')
AND spanner.search(studio_tokens, 'Blue Note Studio')
Spanner 支援 WHERE 子句中的多欄搜尋查詢,以及連詞、析取和否定運算子。您可以在搜尋索引中使用下列所有類型的查詢:
連詞:找出
Title含有「車」字詞,且Studio含有「太陽」字詞的文件。GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')不相交:尋找
Title含有「車」字詞或Studio含有「太陽」字詞的文件GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')否定:尋找
Title不含「汽車」一詞的所有文件。GoogleSQL
SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')PostgreSQL
SELECT albumid FROM albums WHERE NOT spanner.search(title_tokens, 'car')rquery 語言可以執行相同類型的搜尋:
GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, '-car')這兩種形式都會篩選出
Title為 NULL 的文件。權杖化和搜尋函式定義為在 NULL 輸入時傳回 NULL。SQL 將 NOT NULL 定義為 NULL。
此外,您也可以多次參照同一個 TOKENLIST 欄。
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
PostgreSQL
SELECT albumid
FROM albums
WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))
AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))
使用 rquery 語言或 SQL,在同一欄中搜尋多個字詞。建議使用 rquery,因為它能有效率地為參數化查詢快取查詢。除了查詢快取命中率較高之外,rquery 和 SQL 語言的延遲和效能比率相同。
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car OR guy')
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')
您也可以在同一個查詢中,搭配全文搜尋功能使用搜尋索引加速非文字條件。
後續步驟
- 瞭解全文搜尋查詢。
- 瞭解如何排序搜尋結果。
- 瞭解如何執行子字串搜尋。
- 瞭解如何將搜尋結果分頁。
- 瞭解如何混合使用全文和非文字查詢。