如何在现有索引上设置elasticsearch路由?

时间:2015-12-09 04:44:03

标签: elasticsearch routing reindex

我有一个使用elasticsearch默认路由的索引。现在我想建立自己的路由,我该如何实现呢?

official doc中的示例是:

$ curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '
{
   "order":{
      "_routing":{
         "required":true,
         "path":"customerID"
      }
   }
}

执行此操作后,我是否需要重建索引甚至重建整个索引?

2 个答案:

答案 0 :(得分:0)

如果要更改现有映射类型中的路由行为,则需要创建新索引,重新创建映射类型并重新索引数据。我不认为甚至可以更改现有映射类型的_routing。即使您看到acknowledged: true_routing部分也可能完全被忽略。您可以执行上面的更新映射命令,然后检查映射以查看您的映射类型是否具有新的_routing,但我非常确定它不会。

原因与路由的工作方式有关。如果可以动态更新路由,则最终可能会将同一文档放在同一索引的两个不同分片上。第一次索引文档(没有路由)时,文档可能最终在shard1上,然后第二次索引文档(带路由),同一文档可能最终在shard3上。这意味着您的索引中有一个重复的文档,这可能不是您想要的行为。

由于创建新索引和映射类型很容易,只要有疑问,只需从头开始创建一个全新的索引并重新索引您的数据。您将失去更少的时间来弄清楚为什么您的查询会返回奇怪的结果。

答案 1 :(得分:0)

从elasticsearch 2.0开始,不再支持从文档中提取自定义路由。 https://github.com/elastic/elasticsearch/pull/11074 如果要将路由添加到现有索引,则可能需要执行此类操作。 迭代所有customerIDs并使用_reindex api重新索引。

POST _reindex
{
  "source": {
    "index": "source",
    "query": {
      "match": {
        "customerIDs": "customerid1"
      }
    }
  },
  "dest": {
    "index": "dest",
    "routing": "customerid1"
  }
}