模糊搜索与全文搜索到底有什么不同?

H. *_*maz 6 regex sql database algorithm postgresql

在我的项目中,我被要求在我们正在使用的数据库上实现文本查询服务;PostgreSQL。我使用过 Postgresql 全文搜索功能,它在时间方面工作得相当好。全文搜索的一个问题是,它不具有模糊搜索能力。另一方面,有一个名为pgtrgm的扩展 ,提供用于确定字母数字文本相似度的函数和运算符。还有几个使用 pgtrgm 进行文本搜索的示例,例如:

select actor
    from products
    where actor % 'tomy';
Run Code Online (Sandbox Code Playgroud)

如您所知,postgres FTS 的示例也在这里;

SELECT title
FROM pgweb
WHERE to_tsvector(body) @@ to_tsquery('friend');
Run Code Online (Sandbox Code Playgroud)

那么,主要问题是,这两种搜索策略有什么区别?哪种方式更适合搜索文本?可以将它们混合吗?我还需要说的是,性能也是一个重要的问题。提前致谢!

jja*_*nes 4

他们做完全不同的事情。它们之间唯一没有区别的是它们对文本进行操作并且可以从索引的使用中受益。从你的问题来看,你似乎已经对差异有了很好的认识。合适的就是能做你想做的事情的。如果其中之一总是合适的,我们可能就不会创建另一个。

您可以混合使用它们,但是每个都需要不同的索引,它们不能共享索引。此外,您可能还需要不同的表格,因为全文搜索更适合句子或段落,而三元组更适合单个单词或短语。

混合它们的一种方法是拥有一个全文表,和另一个仅列出任何全文中出现的每个不同单词的表。第二个表可用于检测查询中可能的拼写错误,然后一旦通过三元组搜索的建议修复了这些错误,就针对第一个表运行修复后的查询。