Elasticsearch批量API - 索引与创建/更新

Kon*_*ong 38 elasticsearch elasticsearch-bulk

我正在使用Elasticsearch Bulk API来创建或更新文档.

我确实知道它们是创建还是更新,但我可以通过简单地将它们全部化index,或者在SQL意义上"upserts" 来简化我的代码.

使用index(并让ES弄清楚)使用更明确的createupdate

Val*_*Val 65

如果您要发送create,则必须确保文档在索引中尚不存在,否则调用将失败,而发送相同文档index将始终成功.

然后,如果出于性能原因,您知道您将创建一个文档(使用create或者index),然后您只更新几个属性,那么使用update可能有意义.

否则,如果您总是发送完整的文档,我会一直使用它index来创建和更新.每当它看到一个index动作时,ES将创建文件(如果它不存在)或替换它(如果它存在),但该调用将始终成功.

  • 另外,Index API不支持脚本更新,因此,如果要使用脚本,则必须使用Update API。Update API不支持外部版本,因​​此如果要使用外部版本控制,则必须使用Index API。 (2认同)

Jet*_*die 8

简短的回答:没有缺点.

创建和更新端点是特殊情况.使用create,如果文档已经存在,则您无需执行任何操作.如果您没有文档的所有数据,只需添加一些字段,通过更新,您可以提供更少的数据.您还可以确保文档仅在已经存在更新的情况下编制索引.

  • 假设您可能会多次替换给定文档(例如,多次索引完全相同的文档)。既然 ES 并没有真正“删除”任何东西,你不是会添加越来越多的文档并增加它们的版本号,然后将其留给垃圾收集器来清理旧版本吗?在这种情况下,使用 index 与 create 是否会在短期内使索引膨胀,从而可能影响性能?未来大量使用垃圾收集是否也会影响性能?这是我想知道的一个真正的问题,而不是一个修辞问题。谢谢 (2认同)