PostgreSQL和Django中的不精确全文搜索

Her*_*aaf 5 django postgresql full-text-search fuzzy-search

我是PostgreSQL的新手,我不确定如何进行不精确的全文搜索.这并不重要,但我正在使用Django.换句话说,我正在寻找以下内容:

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

在哪里我的条目列表应该包含'hello world'或类似的东西.然后应根据它们的值与指定字符串的距离来排序列表.例如,我希望查询包含包含"Hello World","hEllo world","helloworld","hell world"等的条目,其中某种排名表示每个项目距离完美的距离,查询字符串不变.

你会怎么做呢?

Chr*_*ris 2

你最好的选择是使用Django raw querysets,我将它与 MySQL 一起使用来执行全文匹配。如果数据全部在数据库中并且Postgres提供了匹配功能,那么使用它是有意义的。另外,Postgres 在全文查询的词干提取等方面提供了一些非常有用的东西。

基本上,它可以让您编写所需的实际查询但返回模型(只要您显然正在查询模型表)。

这给你带来的好处是你可以测试你将首先在 Postgres 中使用的确切查询,文档很好地涵盖了全文查询。

目前原始查询集的主要问题是它们不支持计数。因此,如果您将返回大量数据并且应用程序有内存限制,您可能需要采取一些巧妙的措施。


然而,“不精确”匹配实际上并不是全文搜索功能的一部分。相反,您需要 postgres fuzzystrmatch contrib 模块。这里用索引描述了它的用法。