2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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) 來組合它們。還有一個 <N> 版本的 FOLLOWED BY 運算子,其中 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 的詞幹形式。

提交更正

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