从ES 2.2.0迁移到ES 2.3.0时获取RoutingMissingException

时间:2016-03-30 21:43:51

标签: java elasticsearch elasticsearch-java-api

我在prepareDelete中使用BulkRequest查询,其中我有一组我必须删除的ID。

我用过:

BulkRequestBuilder bulkRequest = searchClient.prepareBulk();
for id in ids {
    bulkRequest.add(searchClient.prepareDelete("indexName", "childType", id));
}
BulkResponse bulkResponse = bulkRequest.execute().actionGet();

此删除结构在ES 2.2.0中有效,但在ES 2.3.0中我得到RoutingMissingException

如果我打印bilkResponse.buildFailureMessage()而我

[0]: index [indexName], type [childType], id [215f3228a3c53970883ae0d3b22dae6f], message [[indexName] RoutingMissingException[routing is required for [indexName]/[childType]/[215f3228a3c53970883ae0d3b22dae6f]]]

我甚至没有更改现有索引的设置/映射。

可能是什么原因?

2 个答案:

答案 0 :(得分:0)

似乎类似于回答here

的问题

引用答案完成

  

如果您有父子关系,则需要指定   每次尝试访问子项时,URL中的父项都是   路由现在取决于父母。

     

在您的示例中,您想尝试:

     

curl -XDELETE http://localhost:9200/indexName/childType/215f3228a3c53970883ae0d3b22dae6f?parent=[parent_id]

这对你也有帮助。 Delete child doc

答案 1 :(得分:0)

@rahulroc是对的。我正在添加一个按时间顺序列出的引用该问题的引用列表:

  1. Don't broadcast deletes to all shards(2014)
  2. Delete api: remove broadcast delete if routing is missing when required(2015)
  3. Bulk api: fail deletes when routing is required but not specified(2016)
  4. 也许更新3是使es-2.3.0中出现异常的那个。 因此,您可以使用has_child query从子文档ID中获取父级。