要在 Haystack 中对文档存储执行增量更新,您可以使用大多数文档存储实现提供的 update_documents
方法。此方法允许您添加新文档或更新现有文档,而无需重建整个索引。当您调用 update_documents
时,系统会检查每个文档的 ID:如果 ID 已存在于存储中,则文档会被更新;如果不存在,则会作为新条目添加。例如,如果您使用的是 ElasticsearchDocumentStore,可以将更新或新增文档列表传递给此方法,它将高效地处理更改。
关键一步是确保您的文档具有稳定、唯一的标识符。Haystack 要求每个文档都有一个 id
字段,您应明确定义该字段以避免冲突或意外覆盖。例如,如果您的文档源自数据库,请使用数据库记录的主键作为 id
。如果您正在处理文件,请根据文件路径或校验和生成 ID。如果没有显式 ID,Haystack 可能会根据文档内容创建哈希值,但这可能导致内容略微更改(例如,修复一个拼写错误)时产生重复。例如,添加文档时,您可以设置 Document(id="doc_123", content="...")
以确保一致的标识。
注意事项因文档存储类型而异。对于像 FAISS 或 Milvus 这样的向量数据库,更新文档可能需要使用您选择的嵌入模型重新嵌入内容。如果您修改了文档的文本,则必须重新生成其向量表示,并更新元数据和向量索引。此外,某些存储(例如 InMemoryDocumentStore)缺乏对增量更新的原生支持,需要手动检查现有 ID。对于大规模更新,建议使用批处理以避免内存问题。始终先用数据的子集测试您的更新工作流程,以确保 ID 和内容得到正确处理,尤其是在与包含检索器或排序器的管道集成时。