如何使用Java更新ElasticSearch中的Map?

xdnvmnnf  于 2022-10-06  发布在  Java
关注(0)|答案(2)|浏览(211)

我有一个现有的Map在ElasticSearch,这是在现场生产。目前,每当我更新Map时,其他人必须手动删除索引并再次插入reindex。我们希望ElasticSearch能够自动处理更新/更改的Map。我们如何用Java实现这一点呢?

编辑

我们在应用程序启动期间加载Map的过程如下:

1.检查是否存在Map
1.如果没有,则加载新Map。

如您所见,这是非常简单的,因此它永远不会获得更改的字段/更新的Map。每次应用程序启动时重新加载Map是不是一个坏主意?这件事有什么开销吗?是否有其他程序可以解决更新的Map问题?更重要的是,这是正确的做法吗?

nfeuvbwi

nfeuvbwi1#

没有更新Map的方法。您可以添加新字段,但仅此而已。如果您确实想要更改Map,最好的方法是将所有内容复制到具有更改后的Map的新索引。确保您的应用程序使用指向当前索引的别名

1.使用新Map创建新索引
1.使用扫描/滚动/批量将所有数据复制到新索引
1.将别名移动到新索引
1.删除旧索引

我已经创建了一个工具来帮助您完成此任务。它目前使用的是图形用户界面,但复制正确的类以将其嵌入到您自己的应用程序中并不困难。你可以在这个博客上阅读更多关于它的内容:http://amsterdam.luminis.eu/2015/01/13/maintain-elasticsearch-the-indexes/

我还期待着即将推出的reindex API,不过在这里我听到了一些好消息。

uz75evzq

uz75evzq2#

您不仅可以添加新字段并插入它们的值,还可以更新现有字段的值。

使用UpdateRequest类更新所需的记录(ID),并更改某些字段的值,如下所示:

updateRequest.doc(jsonBuilder().startObject().field("gender", "male").endObject());

另一方面,如果您需要在现有Map中创建新字段,您可以再次使用上面相同的类,并且将自动创建一个新字段:

updateRequest.doc(jsonBuilder().startObject().field("newField", "testContent").endObject()

如果“Newfield”字段不存在,则会创建一个新的字段。虽然您可以创建它,但我怀疑您是否可以指定这个新字段的类型(在reading文档之后)。

此外,我不完全确定您所说的更新Map是什么意思。即使您可以创建新字段和更新旧字段,例如,如果您想要更改现有字段的类型,我认为这是不可能的。还可以查看here,了解如何使用PUT更新现有Map。

相关问题