【问题标题】:How do I update a mapping in ElasticSearch with Java?如何使用 Java 更新 ElasticSearch 中的映射?
【发布时间】:2015-07-24 18:29:00
【问题描述】:

我在 Elastic Search 中有一个现有的映射,这是在现场制作中。目前,每当我更新映射时,其他人都必须手动删除索引并再次插入重新索引所有内容。我们希望 Elastic Search 能够自动处理更新/更改的映射。我们如何使用 Java 实现这一点?

编辑

我们在应用程序启动期间加载映射的过程是这样的:

  1. 检查是否存在现有映射
  2. 如果不加载新映射。

如您所见,这非常简单,因此它永远不会拾取更改的字段/更新的映射。每次应用程序启动时重新加载映射是不是一个坏主意?这有一些开销吗?是否有替代程序来说明更新的映射?更重要的是,这是正确的做法吗?

【问题讨论】:

  • 如果您检查现有映射,为什么不检查现有索引?插入第一个文档的那一刻,您将拥有一个映射。一种建议的解决方案是存储映射的 sha1 键,并在开始检查所提供映射的 sha1 键是否仍然相同。这仅在您不动态添加新字段时才有效。这来自其他评论中提到的链接。 pea53.com/2014/03/versioning-elasticsearch-indices

标签: java search elasticsearch mapping reindex


【解决方案1】:

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

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

我创建了一个工具来帮助您解决这个问题。它目前使用 GUI,但复制正确的类以将其嵌入到您自己的应用程序中并不难。您可以在此博客中了解更多信息: http://amsterdam.luminis.eu/2015/01/13/maintain-elasticsearch-the-indexes/

还要留意即将推出的 reindex api,但这里还没有,但我听说了它的好消息。

【讨论】:

  • 它没有办法自动检测映射的变化吗?
  • 对于一个项目,我实现了类似的东西:pea53.com/2014/03/versioning-elasticsearch-indices 正在努力将它集成到我在博客文章中提到的小项目中,但还没有。
  • 您好,感谢您的宝贵时间。请看看我更新的问题。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多