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
我已经添加了几个例子强调'%'和'之间的差别一些常用拼错的词/短语@@'来自每个分机。如果您的目标是找到包含英语的文档(或任何已知的有您的字典的语言),那么您就是在全文后。如果您的目标是将整个字段与整个字段的字符串进行匹配,并输入一些重要的拼写错误,那么pg_trgm就是您想要的。 – 2013-04-08 18:16:28
感谢您的解释!这清理了很多。好吧,看起来问题可以通过扩展字典的知识来解决。 – 2013-04-08 18:18:44
+1好,清楚的答案。 – 2013-04-08 18:52:12