我使用elasticsearch索引作为缓存表。我的文档结构如下:
{
"mappings": {
"dynamic": False,
"properties": {
"query_str": {"type": "text"},
"search_results": {
"type": "object",
"enabled": false
},
"query_embedding": {
"type": "dense_vector",
"dims": 768,
},
}
}
通过嵌入向量相似度进行该高速缓存搜索,如果新查询的嵌入向量与缓存查询的嵌入向量足够接近,则认为缓存命中,并返回search_results
字段给用户。
问题是我需要大约每小时更新一次缓存结果。我希望我的服务在更新过程中不会失去有效使用缓存的能力,所以我不确定哪一个解决方案是最好的:
1.按顺序一个一个地更新个文档,这样索引就不会被破坏。这种解决方案的缺点恐怕是,每次更新都会导致索引重建,因此该高速缓存请求会变慢
1.用新的结果创建全新的索引,然后用新的索引交换当前缓存索引。我看到的缺点是a)我没有找到交换索引的优雅方法b)用户将比解决方案(1)中更晚获得缓存结果
1条答案
按热度按时间jfgube3f1#
我会选择#2,因为每次更新文档时该高速缓存都会被刷新。
有一种优雅的方法可以交换索引:
您有一个指向当前索引的别名,用新记录填充新索引,然后将此别名指向新索引。
大概是这样的:
1.当前指标名称为项次-2022 -11 -26-001
1.创建指向物料的别名物料-2022 -11 -26-001
1.使用新鲜数据项创建新索引-2022-11-26-002
1.完成后,现在将项目别名指向items-2022-11-26-002
1.删除项目-2022 -11 -26 -001
您对将充当索引的“items”别名运行所有查询。
参考文献:
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html