2

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

当我更新时,我这样做:

  1. 我首先搜索文档,为返回的结果设置更大的限制(比如说,大小:10000)。
  2. 对于每个返回的文档,我都会修改某些值。
  3. 我对弹性搜索整个修改后的列表(批量索引)感到不满。

此操作一直进行到第 1 点不再返回结果。

当我删除时,我这样做:

  1. 我首先搜索文档,为返回的结果设置更大的限制(比如说,大小:10000)
  2. 我删除发送到 elasticsearch _id 文档的每个找到的文档(10000 个请求)

重复此操作,直到点 1 不再返回结果。

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

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

4

2 回答 2

5

对于您的海量索引/更新操作,如果您还没有使用它(不确定),您可以查看批量 api 文档。它是为这种工作量身定做的。

如果要小批量检索大量文档,则应使用scan-scroll搜索而不是使用from/size. 相关信息可以在这里找到。

总结一下 :

  • scrollapi 用于将结果加载到内存中并能够有效地对其进行迭代
  • scan搜索类型禁用排序,这是昂贵的

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

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

每行的格式如下:

{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "1" } }
{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "2" } }
于 2014-09-02T15:13:54.220 回答
2

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

批量 API

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

可能的操作是索引、创建、删除和更新。index 和 create 期望下一行有一个源,并且与标准索引 API 的 op_type 参数具有相同的语义(即,如果已经存在具有相同索引和类型的文档,则 create 将失败,而 index 将添加或替换文档有必要的)。delete 不期望以下行中的源,并且具有与标准删除 API 相同的语义。update 期望在下一行指定部分 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

于 2014-09-03T02:00:57.263 回答