2011-04-18 67 views
5

我是PostgreSQL的新手,我不確定如何去做不精確的全文搜索。這並不重要,但我使用的是Django。換句話說,我正在尋找類似以下內容的東西:PostgreSQL和Django中的不精確全文搜索

q = 'hello world' 
queryset = Entry.objects.extra(
    where=['body_tsv @@ plainto_tsquery(%s)'], 
    params=[q]) 
for entry in queryset: 
    print entry.title 

其中,條目列表應該完全包含「hello world」或其他類似內容。然後應根據它們的值距指定字符串的距離來排序列表。例如,我希望查詢中包含包含「Hello World」,「hEllo world」,「helloworld」,「hell world」等的條目,並附上某種排名表明每件商品離完美的距離,不變的查詢字符串

你會怎麼做呢?

回答

2

最好的辦法是使用Django raw querysets,我用它與MySQL進行全文匹配。如果數據全部在數據庫中並且Postgres提供了匹配功能,那麼使用它是有意義的。加上Postgres提供了一些非常有用的東西,在詞幹等方面全文查詢。

基本上,它可以讓你編寫你想要的實際查詢,但返回模型(只要你顯式查詢模型表)。

優勢這給你的是,你可以測試你將使用第一Postgres裏的確切查詢,the documentation涵蓋全文查詢相當不錯。

現在,原始查詢集的主要問題是它們不支持count。因此,如果您將返回大量數據並且在應用程序中存在內存限制,則可能需要做一些巧妙的事情。


但是,「不精確」匹配並不是真正的全文搜索功能的一部分。相反,您需要postgres fuzzystrmatch contrib模塊。它的用途是described here與索引。

1

最好的辦法是使用搜索引擎來達到此目的。 Django-haystack支持三種不同搜索引擎的整合。