在ElasticSearch中更新缓存的最佳方式是什么?

kqlmhetl  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(224)

我使用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)中更晚获得缓存结果

jfgube3f

jfgube3f1#

我会选择#2,因为每次更新文档时该高速缓存都会被刷新。
有一种优雅的方法可以交换索引:
您有一个指向当前索引的别名,用新记录填充新索引,然后将此别名指向新索引。
大概是这样的:
1.当前指标名称为项次-2022 -11 -26-001
1.创建指向物料的别名物料-2022 -11 -26-001

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "items-2022-11-26-001",
        "alias": "items"
      }
    }
  ]
}

1.使用新鲜数据项创建新索引-2022-11-26-002
1.完成后,现在将项目别名指向items-2022-11-26-002

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "items-2022-11-26-001",
        "alias": "items"
      }
    },
    {
      "add": {
        "index": "items-2022-11-26-002",
        "alias": "items"
      }
    }
  ]
}

1.删除项目-2022 -11 -26 -001
您对将充当索引的“items”别名运行所有查询。
参考文献:
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html

相关问题