2011-04-18 64 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支持三种不同搜索引擎的整合。