Gin索引以及PostgreSQL中gin_trgm_ops和to_tsvector之间的差异

时间:2018-04-20 10:30:56

标签: sql postgresql

我试图了解如何在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));

据我所知(我可能错了)第一个变体将文本分为三个字母标记,并且不依赖于语言。第二个变体使用词干来返回词根列表,这就是为什么取决于语言。

我的问题 - 我的理解是正确的,在什么情况下我应该使用第一个变体,在什么情况下使用第二个变体。

1 个答案:

答案 0 :(得分:2)

你说的是对的。

除此之外,也许是最重要的区别,全文搜索只能搜索整个单词,而trigram索引可用于搜索任意子串,并且还可以找到与搜索条件类似的结果(使用距离算子)。

不出所料,trigram索引在短搜索字符串中表现不佳。