PostgreSQL 提供了兩種資料型別,用於支援全文搜尋,即在自然語言 文件 集合中查詢最匹配 查詢 的文件的活動。 tsvector
型別以一種最佳化過的文字搜尋形式表示文件; tsquery
型別以類似的方式表示文字查詢。 第 12 章 詳細解釋了此功能,而 第 9.13 節 總結了相關的函式和運算子。
tsvector
#一個 tsvector
值是一個排序過的、不重複的 詞素 列表,詞素是經過 規範化 處理的詞語,以合併同一詞語的不同變體(參見 第 12 章 獲取詳情)。排序和去重在輸入時自動完成,如本例所示
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; tsvector ---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
要表示包含空格或標點符號的詞素,請用引號將它們括起來
SELECT $$the lexeme ' ' contains spaces$$::tsvector; tsvector ------------------------------------------- ' ' 'contains' 'lexeme' 'spaces' 'the'
(在此示例和下一個示例中,我們使用了美元定界符字串字面量,以避免因字面量內需要雙引號而產生的混淆。)嵌入的引號和反斜槓必須加倍
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector; tsvector ------------------------------------------------ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'
可選地,可以為詞素附加整數 位置
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector; tsvector ------------------------------------------------------------------------------- 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4
位置通常表示源詞在文件中的位置。位置資訊可用於 鄰近度排名。位置值可以從 1 到 16383;大於此值的數字將被靜默設定為 16383。同一詞素的重複位置將被丟棄。
帶有位置的詞素可以進一步用 權重 標記,權重可以是 A
、B
、C
或 D
。 D
是預設值,因此在輸出時不會顯示
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C
權重通常用於反映文件結構,例如,透過將標題詞與正文詞標記為不同。文字搜尋排名函式可以為不同的權重標記分配不同的優先順序。
重要的是要理解 tsvector
型別本身不執行任何詞語規範化;它假設提供的詞語已根據應用程式進行了適當的規範化。例如,
SELECT 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The'
對於大多數英語文字搜尋應用,上述詞語將被視為未規範化,但 tsvector
不關心。原始文件文字通常應透過 to_tsvector
進行處理,以適當地規範化詞語以供搜尋
SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3
同樣,請參見 第 12 章 獲取更多詳細資訊。
tsquery
#一個 tsquery
值儲存要搜尋的詞素,並可以使用布林運算子 &
(AND)、|
(OR) 和 !
(NOT) 以及短語搜尋運算子 <->
(FOLLOWED BY) 來組合它們。還有一個 <
版本的 FOLLOWED BY 運算子,其中 N
>N
是一個整數常量,指定要搜尋的兩個詞素之間的距離。<->
等同於 <1>
。
括號可用於強制分組這些運算子。在沒有括號的情況下,!
(NOT) 繫結最緊,<->
(FOLLOWED BY) 其次,然後是 &
(AND),|
(OR) 繫結最松。
這裡有一些例子
SELECT 'fat & rat'::tsquery; tsquery --------------- 'fat' & 'rat' SELECT 'fat & (rat | cat)'::tsquery; tsquery --------------------------- 'fat' & ( 'rat' | 'cat' ) SELECT 'fat & rat & ! cat'::tsquery; tsquery ------------------------ 'fat' & 'rat' & !'cat'
可選地,tsquery
中的詞素可以被標記為一個或多個權重字母,這會限制它們只匹配具有這些權重的 tsvector
詞素
SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat'
另外,tsquery
中的詞素可以被標記為 *
來指定字首匹配
SELECT 'super:*'::tsquery; tsquery ----------- 'super':*
此查詢將匹配 tsvector
中任何以“super”開頭的詞。
tsvector
中詞素的引用規則與前面描述的相同;並且,與 tsvector
一樣,任何必需的詞語規範化都必須在轉換為 tsquery
型別之前完成。to_tsquery
函式方便執行此類規範化
SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat'
請注意,to_tsquery
將以與其他詞語相同的方式處理字首,這意味著此比較返回 true
SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ); ?column? ---------- t
因為 postgres
被詞幹提取為 postgr
SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' ); to_tsvector | to_tsquery ---------------+------------ 'postgradu':1 | 'postgr':*
這將匹配 postgraduate
的詞幹形式。
如果您在文件中看到任何不正確的內容、與您在使用特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。