?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
PostgreSQL提供了兩種數據類型用于支持全文檢索, 即通過自然語言documents的集合來找到那些匹配一個query的檢索。 tsvector類型產生一個文檔(以優(yōu)化了全文檢索的形式),tsquery類型用于代表查詢。 Chapter 12中說明了這兩個類型,同時Section 9.13總結了相關的函數和操作符。
tsvector的值時一個無重復值的lexemes排序列表, 即一些歸并為同一個詞的不同變種的詞(可參閱 Chapter 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'
可選的,整型positions也可以放到詞匯中:
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
位置通常表示文檔中的源字的位置。位置信息可以用于proximity ranking。 位置值可以使從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
權可以用來反映文檔結構,如:標記標題以與主體相區(qū)別。全文檢索排序函數可以為不同的權標記來分配不同的優(yōu)先級。
充分理解tsvector類型不能自己標準化這一點是很重要的,它假設傳遞給它的單詞對應用程序來說是恰當的標準化了的,如:
select 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The'
對大多數的英文全文檢索應用來說,上面的單詞會被認為非規(guī)范化的,但tsvector并不關心這些。
原始文件中的文字應該通過to_tsvector
來為檢索恰當的規(guī)范化這些單詞。
SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3
詳細信息可參閱Chapter 12。
tsquery存儲用于檢索的詞匯,并且使用布爾操作符& (AND),| (OR)和! (NOT)來組合它們。 括號用來強調操作符的分組:
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'
在沒有括號的情況下,! (NOT)結合的最緊密,而& (AND)結合的比| (OR)緊密。
可選的,tsquery中的詞匯可以被一個或多個權字母來標記,這些權字母用來限制它們只能與帶有匹配權的tsvector詞匯進行匹配。
SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat'
同樣,tsquery中的詞匯可以用*進行標記來指定前綴匹配:
SELECT 'super:*'::tsquery; tsquery ----------- 'super':*
這個查詢可以匹配tsvector中以"super"開始的任意單詞。
詞匯的引用規(guī)則與之前tsvector中詞匯的描述一樣;并且,與tsvector,任何單詞必須在轉換為tsvector類型前規(guī)范化。
to_tsquery
函數可以方便的用來執(zhí)行規(guī)范化。
SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat'