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
的詞幹還原形式。
如果您在文件中看到任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的內容,請使用此表格來報告文件問題。