PostgreSQL全文搜索和Trigram混淆

问题描述:

我对PostgreSQL,全文搜索和Trigram的整个概念有点困惑。在我的全文检索查询,我使用tsvectors,就像这样:PostgreSQL全文搜索和Trigram混淆

SELECT * FROM articles 
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat'); 

的问题是,这种方法没有考虑拼写错误。然后我开始阅读大约Trigram and pg_trgm

通过其他例子,看起来像trigram被使用或使用向量,但从来都没有。所以我的问题是:他们曾经一起使用过吗?如果是这样,怎么样? trigram替换全文吗? trigrams更准确吗?关于绩效的卦怎么样?

他们服务于非常不同的目的。

  • 全文搜索用于返回匹配的朵朵词的搜索查询的文档。
  • Trigrams为您提供了一种比较两个字符串并确定其外观相似程度的方法。

考虑以下示例:

SELECT 'cat' % 'cats'; --true 

上述返回true因为'cat'非常类似于'cats'(由pg_trgm限制所指示的)。

SELECT 'there is a cat with a dog' % 'cats'; --false 

以上的回报false因为%正在寻找的相若方式两个完整串之间,不找字cats的字符串。

SELECT to_tsvector('there is a cat with a dog') @@ to_tsquery('cats'); --true 

这将返回true becauase的tsvector转化的字符串转换成列表的朵朵字和忽略了一堆的常用词(停用词 - 像“是” &“A”)...然后搜索的朵朵版本cats

这听起来像你想使用卦来自动纠正你的ts_query但这不是真的可能(反正没有任何有效的方式)。他们并不真的知道一个词是misspelt,它可能与另一个词有多相似。他们可能被用来搜索一个单词表来尝试和找到相似的单词,允许你实现一个“你的意思是...”类型的功能,但这个单词需要维护一个单独的表,其中包含您的所有单词search字段。

如果你有你想要的文本索引来匹配你可能想看看Synonym Dictorionaries

+0

我已经添加了几个例子强调'%'和'之间的差别一些常用拼错的词/短语@@'来自每个分机。如果您的目标是找到包含英语的文档(或任何已知的有您的字典的语言),那么您就是在全文后。如果您的目标是将整个字段与整个字段的字符串进行匹配,并输入一些重要的拼写错误,那么pg_trgm就是您想要的。 – 2013-04-08 18:16:28

+0

感谢您的解释!这清理了很多。好吧,看起来问题可以通过扩展字典的知识来解决。 – 2013-04-08 18:18:44

+1

+1好,清楚的答案。 – 2013-04-08 18:52:12