如何在现有索引上设置弹性搜索路由?

How to set up elasticsearch routing on existing index?

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

official doc中的例子是:

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

这样做之后,我是否需要重建索引甚至重建整个索引?

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

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

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

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"
  }
}