Django中SearchVector索引与SearchVectorField的区别及适用场景
关于Django中PostgreSQL全文搜索的疑问
我显然对这个主题存在一些误解,恳请各位指正我的错误。
正如PostgreSQL文档所述,我们应该使用**全文搜索(Full-Text Search)**而非简单的文本搜索操作符。
假设我有一个基于Django的博客应用,使用如下代码进行搜索:
Entry.objects.filter(body_text__search="Cheese")
核心逻辑是:blog_post字段的单条记录作为“文档(document)”,检索词"Cheese"作为搜索关键词。单条文档会被转换为tsvector(简化词向量)结构,检索词则被转换为tsquery(搜索查询)结构。
我梳理了四种场景:
- 无
SearchVectorField且无SearchVector索引:对body_text字段的每条记录,都会生成对应的tsvector并与tsquery匹配,不匹配则继续检查下一条记录。 - 有
SearchVectorField但无SearchVector索引:tsvector向量会存储在SearchVectorField字段中,搜索时无需再生成tsvector,速度会快一些,但仍需逐条检查所有记录。 - 同时拥有
SearchVectorField和SearchVector索引:数据库会创建GIN索引,类似"cat": [3, 7, 18], ...这样的字典结构,存储词元(lexems)的出现位置,无需遍历所有记录,这应该是最快的方案。 - 仅拥有
SearchVector索引:具备上述第三种情况的所有优势。
那我为什么要在表中设置SearchVectorField字段?也就是说,既然已经有了索引,为什么还要存储tsvector?
Django文档中提到:
若此方法过慢,可向模型中添加SearchVectorField。
提前感谢各位的解答。
内容的提问来源于stack exchange,提问作者S.B
相关产品推荐
相关产品推荐

