如何使用Elasticsearch处理多个更新/删除?

时间:2014-09-02 13:50:08

标签: elasticsearch bulkinsert bulkupdate elasticsearch-bulk-api

我需要更新或删除多个文档。

当我更新时,我这样做:

  1. 我首先搜索文档,为返回的结果设置更大的限制(比方说,大小:10000)。
  2. 对于每个返回的文档,我修改了某些值。
  3. 我怨恨弹性搜索整个修改过的列表(批量索引)。
  4. 此操作发生,直到第1点不再返回结果。

    当我删除时,我这样做:

    1. 我首先搜索文档,为返回的结果设置更大的限制(比方说,大小:10000)
    2. 我删除发送到elasticsearch _id文档的每个找到的文档(10000个请求)
    3. 重复此操作,直到第1点不再返回结果。

      这是进行更新的正确方法吗?

      当我删除时,有没有办法可以发送多个ID来一次删除多个文档?

2 个答案:

答案 0 :(得分:5)

对于您的大量索引/更新操作,如果您已经(不确定)使用它,您可以查看bulk api documentation。它适合这种工作。

如果您想通过小批量检索大量文档,则应使用scan-scroll搜索而不是from/size。可以找到相关信息here

总结一下:

  • scroll api用于将结果加载到内存中,并能够有效地迭代它
  • scan搜索类型禁用排序,费用很高

尝试一下,根据数据量,它可以提高批处理操作的性能。

对于删除操作,您可以使用相同的_bulk api一次发送多个删除操作。

每行的格式如下:

{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "1" } }
{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "2" } }

答案 1 :(得分:1)

对于删除和更新,如果您想通过ID删除或更新,可以使用批量api:

  

批量API

     

批量API可以执行许多索引/删除操作   在单个API调用中。这可以大大提高索引速度。

     

可能的操作是索引,创建,删除和更新。指数和   在下一行创建期望源,并具有相同的语义   作为标准索引API的op_type参数(即create will   如果已存在具有相同索引和类型的文档,则失败   而索引将根据需要添加或替换文档。删除   不期望下一行的源,并具有相同的   语义作为标准删除API。更新期望部分   doc,upsert和script及其选项在下一行中指定。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html

您也可以通过查询删除:

  

按查询API删除

     

按查询API删除允许从一个或多个文档中删除文档   索引和基于查询的一种或多种类型。查询也可以   使用简单的查询字符串作为参数,或使用   在请求正文中定义的查询DSL。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete-by-query.html