Elasticsearch: 更新API:按查询更新

创建于 2012-01-12  ·  160评论  ·  资料来源: elastic/elasticsearch

1583 允许更新单个文档。 如果您想更新大量文档并将工作从客户端推送到 ES,则按查询更新将从根本上减少网络往返。

curl -XPOST localhost:9200/index/type/_update -d '{
    "query" : { "constant_score" : { "filter" : { "term" : { "counter" : 0 } } } },
    "script" : "ctx._source.counter += count",
    "params" : {
        "count" : 4
    }
}'
:DistributeCRUD

最有用的评论

查询更新在 2.3.0 和 5.0.0-alpha-1 中生效。 文档在这里

所有160条评论

也会非常喜欢这个功能!

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

我真的很需要这个功能

:+1:

在等待此功能正式完成和发布的同时,我将拉取请求 #2231 打包为插件: yakaz/elasticsearch-action-updatebyquery
玩得开心。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

:+1::祈祷:

+1

+1

有没有办法将查询的分数作为参数传递给更新脚本? 我需要根据其子项的字段更新分数来更新条目。

+1

+1

+1

@scottc52你做到了吗? 我也在寻找一种方法来做到这一点。

+1

@gboivin不。 我正在执行 has_child 查询并发送单独的更新请求,但速度很慢。

也在等这个功能。。

+1

+1

+1

+1

+1

+1

+1

刚刚写了一个小脚本来帮助等待一些东西......更多的“生产准备”;-)

https://github.com/YannBrrd/esNodeUpdater

随意评论/更新...

+1

开发团队是否对此功能有官方状态? 我没有看到他们的任何意见。 是否有计划将此功能添加到核心中,还是倾向于让用户使用上面列出

我们计划重新讨论这个,我们搁置这个的主要原因是我们需要有一种方法来停止查询的现有更新,因为它们可能会在大量数据上错误地执行,从而导致问题.. .

+1。 感谢您的更新并致力于此。

+1

+1

+1

+1

+1,听起来很有用

+1

+1

+1

+1

+1

+1

+1

+1

+2

+1

+10

+1

+1

+1

你有没有想过用一个双 HTTP 调用来实现这个功能。 我想到了warmers,它提供了存储查询然后执行查询的可能性(这不是一回事,但它让我思考)。

@kimchy你说你想了一种方法来阻止更新,如果它是在大量数据上错误地启动的。 如果你停止它,也许索引数据将处于无效状态(也许有可能回滚......?)。 也许更好的方法是防止错误。

如果在触发真正的大规模更新之前需要两次 HTTP 调用(1 次准备和 1 次真正触发它,中间有一个转换 ID),然后更新状态处理程序(如 SolR 中的 dataimporthandler)知道查询何时真正完成。

我不确定是否真的很清楚,但我认为这可以成为防止错误调用的解决方案......

+1

+1

我也想为这个点赞。

+1

@kimchy :性能不是问题:目前我正在运行数以千计的查询来查找数据(例如,用于 GPS 位置的 OSM 索引地址查找 - 查找速度很快,嘿,我有 ElasticSearch!)并更新其他索引中的每个文档(例如添加明文地址)。 我的更新添加了新字段。 ES 中的批量更新必须比 10.000 个查找查询 + 10.000 个更新请求(也使用批量更新......)更有效。 从编码和运行时的角度来看,它会更有效率,例如,批量更新文件有 20.000 行,而新功能可能只有 2 行——所有数据都通过网络移动,使 ES 忙于读取批量更新文件......

也许您同意为更新操作添加限制,例如 _update/_query=some_conditions&size=1000 这样它就可以避免更新一百万个文档——我们作为开发人员可以决定是否运行 1000*1000 次更新来更新一百万条记录......它如果需要另一个更新调用,应该返回更新的文档数以提供一些控制。

+1

对于我的场景(在其他索引中查找后丰富记录)我可能会做另一种方式:首先将数据插入到 mongoDb,在 ElasticSearch 中查找在 Mongo 中更新记录,使用 mongo river 在 ElasticSearch 中获得最终结果以在 GUI 中显示它(构建在 ES 之上)。 有没有人经历过这样的场景? 我希望我只能采用 ES 的方式……直到现在,我确实拒绝在我的项目中使用 DB。

你好,

你可以简单地使用 Couchbase + Elasticsearch,作为 Couchbase
提供与 Elasticsearch 的接口

亲切,
雅恩·巴罗

2014-02-03 seti123通知@github.com:

对于我的场景(在其他索引中查找后丰富记录)我可能
另一种方式:首先将数据插入到 mongoDb,在
ElasticSearch在Mongo中更新记录,使用mongo river得到最终结果
在 ElasticSearch 中以 GUI 显示它(构建在 ES 之上)。 有没有人
经历过这样的场景? 我希望我只能去 ES ......直到
现在,我确实拒绝在我的项目中使用数据库。

直接回复本邮件或在Gi tHub上查看
.

+1

+100

+1

+1

ElasticSearch 中是否有替代方法,例如在插入或更新新数据时触发执行操作的脚本? 某种之前的索引触发器可以帮助我删除预处理链(我们现在在 ES 中插入数据之前使用 REDIS 和 0MQ 处理链做了消息队列 - 所有这些都需要网络带宽来混洗数据以进行并行处理...... )

我想看看
http://localhost :9200/index/type/_preprocessBeforeIndex?script=myDataAnalysisScript
http://localhost :9200/index/type/_preprocessBeforeUpdate?script=myDataAnalysisScript
脚本必须能够在 ES 存储/索引它之前向当前记录添加新字段(以避免更改后的双重索引操作)。 由于我们经常使用 node.js,脚本应该使用所需的语言(在我们的案例中为 JavaScript)。

如果我们可以在每个数据类型的 MAPPING 中定义脚本而不是在生成的索引上,那就更好了。
任何能够触发此类脚本的插件可用? 在脚本中使用 ES API 的任何文档?

+1

+1

+1

+1

+1

+1

+1

+1

+1

正在等待此功能...(+1)

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

此功能是否正在开发中?
这将解决目前在应用程序级别几乎不可能可靠处理的许多问题。

+1

+1

+1

只是提醒您,自 2013 年 2 月中旬以来,我已经打包并维护了“官方拉取请求”#2231,通过@martijnvg分支作为插件: yakaz/elasticsearch-action-updatebyquery

+1

+1

+1

+1

+1
自 2013 年 2 月以来,此功能怎么可能还没有合并到 master?

+1
同上@KrzysztofWilczek评论。 为什么公关在过去一年停滞不前,没有更新? 这是迄今为止评论最多的问题。

+1

几个月前我们遇到了这个问题(请参阅我的帖子@seti123一月/二月),我想分享我们的结果 - 在放弃 DB+ES River 之后(过于担心版本依赖性),我们成功地评估了我们的用例Crate Data(它使用 ES 作为库并添加了一个用于映射和查询的 SQL 接口,包括“按查询更新”https://crate.io/docs/stable/sql/dml.html#updating-data)。
阅读相似之处和不同之处的一个很好的起点: https :

关闭支持 #2230

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

将通过查询支持 setPostFilter 更新吗?
问题 #12295

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

有人可以对此进行评论并提供反馈。
https://discuss.elastic.co/t/updatebyqueryresponse-throwing-timeout/29176

查询更新失败,同时更新超过 20 + 百万条记录。

@Praveen82您使用的是第 3 方插件。 这不是请求支持的正确位置,您应该将其作为问题发布到该插件的存储库中。

https://github.com/elastic/elasticsearch/pull/15125正在实现一种看起来有点像的语法

curl -XPOST localhost:9200/index/type/_update_by_query -d '{
    "query" : { "term" : { "counter" : 0 } },
    "script" : {
      "inline": "ctx._source.counter += count",
      "params" : {
          "count" : 4
      }
  }
}'

之所以停滞这么久是因为这些超时:到目前为止,有一种方法可以在 Elasticsearch 中启动长时间运行的作业并报告它们的状态和事物。 随着任务管理 api (#15347) 的出现,我在“重新索引”和“按查询更新”风格的事情上拿起了火炬,并再次启动它们,目的是尽快与任务管理集成。

无论如何,#15125 和任何后续 PR 都是寻找此功能的地方。

+1

+1

+1

+1

+1

查询更新在 2.3.0 和 5.0.0-alpha-1 中生效。 文档在这里

2.3.+ 或 5.+ 中的按查询更新是否支持 javascript 插件?

2.3.+ 或 5.+ 中的按查询更新是否支持 javascript 插件?

如果你真的想要,当然可以。 在 2.3+ 中,我们针对 groovy 测试了按查询更新,在 5.+ 中,我们针对无痛进行了测试。 我们曾经针对 groovy 进行测试,它也在那里工作。 我希望 javascript 可以正常工作。

JS 支持会非常流畅。

JS 支持会非常流畅。

正如我所说,它存在,你只需要安装插件。

所有这些语言的问题在于它们在 JVM 上的实现没有正确地面向嵌入。 这就是我们默认不包含它的原因。

无论如何,如果你想更多地谈论它,我认为discuss.elastic.co是一个更合适的地方。

此页面是否有帮助?
0 / 5 - 0 等级