包含 tsvector 字段的可能原因?

Mor*_*ryx 5 postgresql full-text-search tsvector

我对tsvector字段(重新)感到困惑。这是常见的,看文字的例子被连接成的tsvector字段,然后索引。如果您查找 PG 12 生成的列,您会发现快速显示tsvector字段填充的示例。

既然这个字段的唯一目的就是支持索引,那为什么不用表达式构建索引,跳过向量列呢?我之前顺便问过这个问题(找不到),记得听到回复“这个专栏毫无意义”。这对我来说很有意义。最近,我一直在关注这篇文章的一些评论:

使用 PostgreSQL 12 微调全文搜索

这件作品相当不错,顺便说一句。有这样的评论:

实现 tsvector 的一个原因是不在重新检查时评估表达式,这本身可能非常昂贵。

在解释分析中勾选'Recheck Cond',条件可以被真正检查,因此条件(to_tsvector)将被计算。

\d t1
Table “public.t1”
Column | Type    | Collation | Nullable | Default
--–----+---------+----------–+----------+---
id     | integer |           |          |
t      | text    |           |          |
Indexes:
  "t1_to_tsvector_idx" gin (to_tsvector('english'::regconfig, t))

explain analyze select * from t1 where to_tsvector(‘english’, t) @@ to_tsquery(‘english’,’foo’);
Run Code Online (Sandbox Code Playgroud)
\d t1
Table “public.t1”
Column | Type    | Collation | Nullable | Default
--–----+---------+----------–+----------+---
id     | integer |           |          |
t      | text    |           |          |
Indexes:
  "t1_to_tsvector_idx" gin (to_tsvector('english'::regconfig, t))

explain analyze select * from t1 where to_tsvector(‘english’, t) @@ to_tsquery(‘english’,’foo’);
Run Code Online (Sandbox Code Playgroud)

我很困惑。在行中存储向量是否有很好的案例?我在 Postgres 的这一部分不够流利,无法构建令人满意的测试。我仍在研究 Postgres 中的 FTS 和模糊比较选项,但需要在下个季度构建一些实质性的东西,这就是为什么我渴望提前获得详细信息。现在 3500 万行,迅速增加。

Pao*_*rre 3

当您询问包含 tsvector 字段的可能原因时,我认为如果您必须将其他表的列中的 tsvector 文本放入 tsvector 文本中,则可以肯定。

如果您有一个博客文章表,并且想要对标题、内容和相关标签名称执行全文搜索,但标签是一个单独的表,不幸的是,您不能在索引中使用生成的列或函数,但您可以更新你的 tsvector (使用触发器或类似的),然后你可以更新列上的索引。

我希望我给了您使用 tsvecor 字段的合理理由。