【问题标题】:How to set up elasticsearch routing on existing index?如何在现有索引上设置弹性搜索路由?
【发布时间】:2015-12-09 04:44:02
【问题描述】:

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

official doc中的例子是:

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

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

【问题讨论】:

  • 实际上文档说“警告:不再支持从文档中提取自定义路由;它已在 Elasticsearch v2.0 中删除。”

标签: elasticsearch routing reindex


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的详细解答!
  • 您好@val,您如何以这种方式使用带有自定义路由的reindex API?欢呼
  • @ThomasDecaux 是的,你可以,就像described in the official documentation
  • 我不确定,不再支持映射中的路由,reindex 说它保留路由,除非您通过脚本更改它。
  • @ThomasDecaux 我建议您创建一个新问题并解释您的问题是什么,您将有更多机会获得更好的答案。这不是专门针对重新索引 API 的 ;-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2021-03-03
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多