PostgreSQL和Django中的不精确全文搜索
问题描述:
我是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”等的条目,并附上某种排名表明每件商品离完美的距离,不变的查询字符串
你会怎么做呢?
答
最好的办法是使用Django raw querysets,我用它与MySQL进行全文匹配。如果数据全部在数据库中并且Postgres提供了匹配功能,那么使用它是有意义的。加上Postgres提供了一些非常有用的东西,在词干等方面全文查询。
基本上,它可以让你编写你想要的实际查询,但返回模型(只要你显式查询模型表)。
优势这给你的是,你可以测试你将使用第一Postgres里的确切查询,the documentation涵盖全文查询相当不错。
现在,原始查询集的主要问题是它们不支持count。因此,如果您将返回大量数据并且在应用程序中存在内存限制,则可能需要做一些巧妙的事情。
但是,“不精确”匹配并不是真正的全文搜索功能的一部分。相反,您需要postgres fuzzystrmatch contrib模块。它的用途是described here与索引。