我是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可以很好地覆盖全文查询.
目前原始查询集的主要问题是它们不支持计数.因此,如果您要返回大量数据并对应用程序有内存限制,则可能需要做一些聪明的事情.
然而,“不精确”匹配并不是全文搜索功能的一部分.相反,你想要postgres fuzzystrmatch contrib模块.它的用法是described here和索引.