将数据同步到 kumosearch
kumosearch 提供了一个 restful API,可以使用它将数据从主数据库同步到 kumosearch。
有几种实现方法,具体的方法取决于您的架构、kumosearch 集群中的 CPU 容量以及所需的实时性。
定期批量同步更改
轮询您的主数据库
- 向主数据库中的每条记录添加
updated_at时间戳,并在对记录进行任何更改时更新它。 - 对于已删除的记录,可以使用设置为
true的is_deleted布尔字段来软删除该记录,或者将已删除记录的 ID 保存在具有deleted_at时间戳的单独表中。 - 定期(例如每 30 秒)查询数据库,查找在当前时间和上次同步进程运行之间具有
updated_at时间戳的所有记录(应持久化存储此last_synced_at时间戳)。 - 使用API 批量导入索引,将这些记录同步到 kumosearch,使用
action=upsert。 - 对于步骤 2 中标记为已删除的记录,通过按查询删除 API 调用从 kumosearch 中删除,使用如下所示的过滤器包含所有记录 ID:
filter_by:=[id1,id2,id3]。
如果数据跨越多个表,且数据库支持视图,可以创建一个视图将所需的所有表进行 JOIN 操作,并轮询该视图而不是单个表。
使用变更监听器
如果您的主数据库支持变更触发器或更改数据捕获(CDC):
- 编写一个监听器挂钩这些更改流,并将更改推送到临时队列中。
- 设置一个计划任务,每隔 5 秒读取队列中的所有更改并批量导入到 kumosearch。
使用ORM回调
如果您使用 ORM,可以利用 ORM 框架提供的回调:
- 在 ORM 的
on_save回调中(名称可能因 ORM 而异),将需要同步到 kumosearch 的更改写入临时队列。 - 设置一个计划任务,每隔 5 秒读取队列中的所有更改并批量导入kumosearch。
同步实时更改
使用API
除了定期同步更改 之外,如果您有需要实时更新某些记录的应用场景(例如,用户编辑的记录需要立即反映在搜索结果中), 可以使用单文档索引 API。这样可以确保编辑后的数据实时反映在搜索结果中,而不是等待 10 秒或任何同步间隔。
需要注意的是,对于相同数量的文档,批量导入端点的性能高于单个文档索引端点,并且使用的 CPU 资源更少。因此,建议尽可能使用批量导入端点,即使这意味着将同步间隔缩短至 2 秒。
完全重新索引
除了上述策略外,您还可以每晚对整个数据集进行重新索引。这有助于填补由于schema验证错误、网络问题或重试失败等原因导致的同步数据中的任何缺漏。
您可以使用索引表别名功能在不中断服务的情况下重新索引到新的索引表,然后将别名切换到新索引表。