我对PostgreSQL的全部概念,全文搜索和Trigram有点困惑。在我的全文搜索查询中,我正在使用tsvectors,如下所示:
SELECT * FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat');
问题是,这种方法不能解决拼写错误。然后我开始阅读Trigram and pg_trgm
:
通过其他示例,似乎使用了trigram或使用了向量,但从未使用过两者。所以我的问题是:他们一起使用过吗?如果是这样,怎么样? trigram会替换全文吗?三卦更准确吗?三卦如何表现?
答案 0 :(得分:32)
它们服务于非常不同的目的。
请考虑以下示例:
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