python - 使用全文搜索将长文本和表格文档存储在数据库中的最佳方法是什么
问题描述
我的应用程序存储了数百万份法律文件,从 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。先感谢您。
解决方案
推荐阅读
- android-layout - 如何在 MainActivity.kt 中膨胀布局导航视图
- javascript - 如何在本机反应中将无状态函数转换为类组件
- mysql - 如何从 mysql 表中获取数据并使用 php 插入另一个表?
- python - 有人可以帮我弄清楚如何打印此下拉列表中的选项吗?
- android - com.google.android.gms.internal.measurement.zzdf 错误在 android
- python - Zeppelin PySpark - java.net.ConnectException:连接被拒绝(连接被拒绝)
- oracle-data-integrator - 在 ODI 11G 负载计划中将变量传递给场景不起作用
- lua - 您如何在 Roblox 中使用脚本锚定大量群组?
- c# - 在 Unity C# 中,只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句
- json - value 将类变量更改为 JSON 字符串