特定领域的弹性搜索路由

时间:2016-03-21 05:20:03

标签: elasticsearch

嗨我想在特定字段上设置自定义路由" userId"在我的Es v2.0上。    但它给了我错误。我不知道如何在ES v2.0上设置自定义路由

请大家帮帮我。谢谢。在使用现有索引创建自定义路由时,以下是错误消息。

{
  "error": {
     "root_cause": [
       {
          "type": "mapper_parsing_exception",
          "reason": "Mapping definition for [_routing] has unsupported parameters:  [path : userId]"
       }
     ],
   "type": "mapper_parsing_exception",
   "reason": "Mapping definition for [_routing] has unsupported parameters:  [path : userId]"
   },
 "status": 400
}

2 个答案:

答案 0 :(得分:3)

在ES 2.0中,_routing.path元字段has been removed。所以现在你需要这样做:

在您的映射中,您只能指定需要路由(但不能再指定path):

PUT my_index
{
  "mappings": {
    "my_type": {
      "_routing": {
        "required": true 
      },
      "properties": {
        "name": {
          "type": "string"
        }
      }
    }
  }
}

然后在索引文档时,您可以在查询字符串中指定路由值,如下所示:

PUT my_index/my_type/1?routing=bar 
{
  "name": "foo"
}

答案 1 :(得分:1)

您仍然可以使用基于被索引数据中的字段的自定义路由。您可以设置一个简单的管道,然后在每次索引文档时使用管道,或者您也可以更改索引设置以在索引收到文档索引请求时使用管道。

了解管道 here

为了更清晰,请阅读文档的上方和下方。它不是用于设置自定义路由,但可以用于此目的。自定义路由被禁用的一个很好的原因是要使用的字段可能具有导致意外行为的空值。因此,请自行处理该问题。

对于路由,这是一个示例管道 PUT :

PUT localhost:9200/_ingest/pipeline/nameRouting
Content-Type: application/json

{
  "description" : "Set's the routing value from name field in document",
  "processors" : [
    {
      "set" : {
        "field": "_routing",
        "value": "{{_source.name}}"
      }
    }
  ]
}

索引设置为:

{
  "settings" : {
    "index" : {
      "default_pipeline" : "nameRouting"
    }
  }
}