PostgreSQL全文搜索和Trigram混淆

时间:2013-04-08 16:30:33

标签: postgresql full-text-search pattern-matching

我对PostgreSQL的全部概念,全文搜索和Trigram有点困惑。在我的全文搜索查询中,我正在使用tsvectors,如下所示:

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

问题是,这种方法不能解决拼写错误。然后我开始阅读Trigram and pg_trgm

通过其他示例,似乎使用了trigram或使用了向量,但从未使用过两者。所以我的问题是:他们一起使用过吗?如果是这样,怎么样? trigram会替换全文吗?三卦更准确吗?三卦如何表现?

1 个答案:

答案 0 :(得分:32)

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

  • 全文搜索用于返回与词干词的搜索查询匹配的文档。
  • 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因为tsvector将字符串转换为词干列表并忽略了一堆常用词(停止词 - 比如'是'&'a')...然后搜索词干版本cats

听起来你想使用三元组来自动纠正你的ts_query,但这实际上是不可能的(无论如何都不是以任何有效的方式)。他们并不真正知道一个单词拼写错误,它与另一个单词有多么相似。他们可以用于搜索单词表以尝试找到相似的单词,允许你实现“你是说......”类型的功能,但是这个单词需要维护一个包含所有单词的单独表格您search字段中使用的字词。

如果您有一些常见的拼写错误的单词/短语,您希望文本索引匹配,您可能需要查看Synonym Dictorionaries