2009-09-28 31 views
12

比方說,你有一個Postgres 8.3表如下:如何在利用全文索引的postgres中進行基於短語的全文搜索?

CREATE TABLE t1 (body text, body_vector tsvector);

我希望能夠搜索它使用全文索引(GIST,杜松子酒或兩者的tsvector字段)的短語。我已經能夠找到的最佳解決方法是首先對兩個單詞(布爾AND)進行全文搜索,然後對該短語的主體進行類似的比較。當然,這不會捕獲postgres的全文搜索爲您做的任何詞幹或拼寫檢查。這方面的一個例子是,如果我在搜索短語「W1,W2,」,我會使用:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

有沒有辦法做到這一點,你不必訴諸於搜索文字欄?

回答

11

如果你想要精確的詞組匹配,那就這樣做。您也可以嘗試WHERE body_vector @@ plainto_tsquery('w1 w2'),然後通過排序進行排序。 (點在於,其中的話是對彼此相鄰命中應該在頂部結束)

4

更新:PostgreSQL的9.6文本搜索支持詞組

select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

或單詞之間的距離:

-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

也許我沒有捕捉到的東西,但這不需要輸入字符串包含單引號之間的搜索短語?一般來說,當這個短語來自用戶輸入,並且文檔來自數據庫列時,任何人都可以使用它? – 2015-04-11 16:24:56

+1

這仍然不是「詞組搜索」。這僅僅是因爲你的tsvector短語'紐約'被包裹在單引號中。 – soyayix 2016-09-22 23:42:22

+0

是的兩個函數都行 - 但是你的tsvector字符串在大多數情況下不會有單引號 - 如果它確實那麼搜索短語是什麼..我有一個postgreSQL 9.4和你有工作的查詢 - 這不僅是具體到9.6。 精選 'i heart new york city':: tsvector @@'new':: tsquery,--true '我心紐約市':: tsvector @@'new&york':: tsquery, - true 'i heart new york city':: tsvector @@'''new york''':tsquery --false – soyayix 2016-09-23 00:35:47