我需要更新或删除几个文档。
当我更新时,我会这样做:
- 我首先搜索文档,为返回的结果设置了一个更大的限制(比如说,大小:10000)
- 对于每个返回的文档,我都会修改某些值
- 我讨厌弹性搜索整个修改过的列表(批量索引)
此操作一直进行到点1不再返回结果为止。
当我删除时,我会这样做:
- 我首先搜索文档,为返回的结果设置了更大的限制(比如说,大小:10000)
- 我删除了发送到elasticsearch_id文档的所有找到的文档(10000个请求)
重复此操作,直到点1不再返回结果。
这是进行更新的正确方式吗?
当我删除时,有没有一种方法可以同时发送多个ID来删除多个文档?
对于您的大规模索引/更新操作,如果您还没有使用它(不确定),您可以查看批量api文档。它是为这种工作量身打造的。
如果要小批量检索大量文档,则应使用scan-scroll
搜索,而不是使用from/size
。相关信息可在此处找到。
综上所述:
scroll
api用于将结果加载到内存中,并能够有效地对其进行迭代scan
搜索类型禁用排序,成本高昂
尝试一下,根据数据量的不同,它可以提高批处理操作的性能。
对于删除操作,您可以使用相同的_bulk
api一次发送多个删除操作。
每行的格式如下:
{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "1" } }
{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "2" } }
对于删除和更新,如果您想通过id删除或更新,可以使用批量api:
散装API
批量API使执行许多索引/删除操作成为可能在单个API调用中。这可以大大提高索引速度。
可能的操作包括索引、创建、删除和更新。索引和create-expect下一行有一个源,并且具有相同的语义作为标准索引API的op_type参数(即create将如果具有相同索引和类型的文档已经存在,则失败,而索引将根据需要添加或替换文档)。删去在以下行中不期望有源,并且具有相同的语义作为标准的删除API。更新要求doc、upstart和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