我试图了解如何在PostgreSQL中使用gin索引进行全文搜索。我发现有两种方法可以做到这一点。例如,如果我们有一个表:
CREATE TABLE IF NOT EXISTS users (
id SERIAL NOT NULL,
name VARCHAR(512) NOT NULL,
PRIMARY KEY (id));
然后我们可以使用这些变体创建索引:
CREATE INDEX users_name_idx ON users USING gin (name gin_trgm_ops);
或
CREATE INDEX users_name_idx ON users USING gin (to_tsvector('language', name));
据我所知(我可能错了)第一个变体将文本分为三个字母标记,并且不依赖于语言。第二个变体使用词干来返回词根列表,这就是为什么取决于语言。
我的问题 - 我的理解是正确的,在什么情况下我应该使用第一个变体,在什么情况下使用第二个变体。
答案 0 :(得分:2)
你说的是对的。
除此之外,也许是最重要的区别,全文搜索只能搜索整个单词,而trigram索引可用于搜索任意子串,并且还可以找到与搜索条件类似的结果(使用距离算子)。
不出所料,trigram索引在短搜索字符串中表现不佳。