如何在现有索引上设置弹性搜索路由?
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"
}
}
我有一个使用 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"
}
}