支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

8.11. 文字搜尋類型 #

PostgreSQL 提供了兩種資料類型,旨在支援全文搜尋,這是一種在自然語言的文件集合中搜尋,以找到與查詢最匹配的文件之活動。tsvector 類型以針對文字搜尋優化的形式表示文件;tsquery 類型類似地表示文字查詢。第 12 章提供了對此功能的詳細說明,而第 9.13 節總結了相關的函數與運算符。

8.11.1. 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。針對相同詞位的重複位置將被捨棄。

具有位置的詞位可以進一步使用權重來標記,權重可以是 ABCDD 是預設值,因此不會顯示在輸出上

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 章以取得更多詳細資訊。

8.11.2. 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 的詞幹還原形式。

提交更正

如果您在文件中看到任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的內容,請使用此表格來報告文件問題。