我有一个使用elasticsearch默认路由的索引。现在我想建立自己的路由,我该如何实现呢?
official doc中的示例是:
$ curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '
{
"order":{
"_routing":{
"required":true,
"path":"customerID"
}
}
}
执行此操作后,我是否需要重建索引甚至重建整个索引?
答案 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"
}
}