首页 > 解决方案 > 使用全文搜索将长文本和表格文档存储在数据库中的最佳方法是什么

问题描述

我的应用程序存储了数百万份法律文件,从 1 页到 3000 页不等。目前我的模型如下所示:

class Document(models.Model):
    title = TextField()
    content = ArrayField(TextField())
    search_vector = SearchVectorField(null=True)

因此,示例文档用例如下所示:

doc = Document(title="Legal brief", content=["page 1 text...", "page 2..."])

使用数组的原因是我在应用程序的每个页面的底部都包含一个带有页码的 HTML 水平线。

然后我使用了一个自定义 Postgres 触发器函数,该函数使用该array_to_string函数将页面列表滚动到一个列表中,tsvector并保持search_vectors字段更新以进行全文搜索和排名。

我的问题是我应该重构我的模型以包含一个Page对象,并将每个文本页面存储在一个单独的对象类型中吗?用例是这样的,我从不单独访问单个页面,并且一旦创建的文档是静态的——它们永远不会改变。我主要关心的是尽可能快地进行搜索,尤其是在整个数据库(所有数百万个文档)中,我的次要问题是我的一小部分文档很长(1000 多页)并且不适合字段长度的4mb限制SearchVectorField,并且可能会以我不完全理解的方式降低数据库性能。该网站在 EST 营业时间内使用量很大,因此效率很重要。

我正在使用 PostgreSQL 10(Aurora 无服务器)和 Django 3.2。先感谢您。

标签: pythondjangopostgresql

解决方案


推荐阅读