我(重新)对tsvector
字段感到困惑。经常看到文本示例被连接到 tsvector 字段中,然后被索引。如果您查找 PG 12 生成的列,您会发现快速tsvector
显示字段填充的示例。
既然这个字段的唯一目的是支持索引,那为什么不用表达式建立索引,跳过向量列呢?我之前顺便问过这个问题(找不到),记得听到“这个专栏毫无意义”。这对我来说很有意义。最近,我一直在关注这篇文章的一些评论:
这部作品相当不错,顺便说一句。有这样的评论:
实现 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万行,快速增长。