44

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

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

问题是,这种方法不考虑拼写错误。然后我开始阅读有关 Trigram 和pg_trgm

查看其他示例,似乎使用了三元组或使用了向量,但从不同时使用两者。所以我的问题是:它们曾经一起使用过吗?如果是这样,怎么做?trigram 会取代全文吗?三元组更准确吗?三元组对性能的影响如何?

4

1 回答 1

63

它们的用途非常不同。

  • 全文搜索用于返回匹配词干搜索查询的文档。
  • 三元组为您提供了一种比较两个字符串并确定它们看起来有多相似的方法。

考虑以下示例:

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

以上返回 true 因为与(由 pg_trgm 限制规定)'cat'非常相似。'cats'

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 将字符串转换为词干列表并忽略了一堆常用词(停用词 - 像 'is' 和 'a')... 然后搜索cats.

听起来您想使用三元组来自动更正您的ts_query,但这实际上是不可能的(无论如何都不是以任何有效的方式)。他们真的不知道一个词拼错了,也不知道它与另一个词有多相似。它们用于搜索单词表以尝试查找相似的单词,从而允许您实现“您的意思是……”类型的功能,但该单词需要维护一个单独的表,其中包含您的search字段中使用的所有单词。

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

于 2013-04-08T17:01:14.877 回答