2013-05-12 148 views
2

我在這我想使用的PG全文搜索功能來搜索文件名的數據庫。我正在一個文件名錶上運行搜索查詢,問題是排名函數沒有按照我希望的那樣對結果進行排名。爲了討論的方便,我們假設該架構是這樣的:PostgreSQL的全文搜索

create table files (
    id serial primary key, 
    filename text, 
    filename_ft tsvector 
); 

,我跑看起來像這樣的查詢:

select filename, ts_rank(filename_ft, query) 
from files, to_tsquery('simple', 'a|b|c') as query 
where query @@ name_ft 
order by rank desc limit 5; 

這將返回5個結果具有最高等級。但是,這些搜索查詢來自另一個進程,並且在大多數情況下,查詢中都有一些「垃圾」。例如,可能會執行'a xxxx'的查詢,其中xxxxx只是其他一些術語。在大多數情況下,這仍會返回正確的結果,因爲後綴根本不在數據庫中。

然而,有時一個查詢中包含一些無關的信息,與分級功能螺絲。例如,對'abc'的查詢將返回一個包含令牌'bc'作爲第一個結果的文件名,並將'a'的精確匹配作爲第二個結果,我猜這是由於第一個結果包含更大實際搜索令牌的百分比。

在大多數情況下(如果不是全部)的最重要的標誌出現在查詢中的第一個標記,所以我的問題是,有沒有辦法讓在查詢中表徵的加權?

回答

1

有沒有辦法讓在查詢中表徵的加權?

是的,有。見the documentation;搜索「體重」。

分配權重是否是正確的選擇是另一回事。在我看來,你真的想在索引創建和搜索中排除輸入中的一些數據到to_tsvector,所以你不要在索引中包含那些垃圾。

+0

據我瞭解,文檔,你可以分配權重中的tsvector以語意,但我無法找到有關的查詢符號分配權重東西。無關的數據不在tsvectors中,它在查詢中提供。 – Blubber 2013-05-12 09:08:10