5

我(重新)对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’);
QUERY PLAN

Bitmap Heap Scan on t1 (cost=8.05..19.02 rows=6 width=36) (actual time=0.019..0.019 rows=0 loops=1)
  Recheck Cond: (to_tsvector(‘english’::regconfig, t) @@ ”’foo”’::tsquery)
  -> Bitmap Index Scan on t1_to_tsvector_idx (cost=0.00..8.05 rows=6 width=0) (actual time=0.017..0.017 rows=0 loops=1)
     Index Cond: (to_tsvector(‘english’::regconfig, t) @@ ”’foo”’::tsquery)
Planning Time: 0.076 ms
Execution Time: 0.051 ms
(6 rows)

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

4

1 回答 1

2

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

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

我希望我给了你一个合理的理由来使用 tsvecor 字段。

于 2019-11-11T09:42:48.450 回答