2016-06-06 50 views
0

我正在从betfair api-ng获取marketcatalogue数据,我想将它存储到elasticsearch(v1.4.4)中。为来自远程api的字典定义elasticsearch映射

来自API的数据包含很多属性和复杂类型。有一个名为的跑步者其中包含相关数据和Dictionary<string,string>。我想定义这样的映射,所以它将数据存储在Elasticsearch中。样本映射下面是:

"marketcatalogue" :{ 
    "properties":{ 
     "marketId":{"type":"string", "index": "not_analyzed" }, 
     "marketName":{"type":"string", "analyzer":"keylower" }, 
     "isMarketDataDelayed":{"type","boolean"}, 
     "description":{ 
      "persistenceEnabled":{"type","boolean"}, 
      "bspMarket":{"type","boolean"}, 
      "marketTime":{"type" : "date","format":"dateOptionalTime"}, 
      "suspendTime":{"type" : "date","format":"dateOptionalTime"}, 
      "settleTime":{"type" : "date","format":"dateOptionalTime"}, 
      "bettingType":{"type":"integer"}, 
      "turnInPlayEnabled":{"type","boolean"}, 
      "marketType":{"type":"string", "analyzer":"keylower" }, 
      "regulator":{"type":"string", "analyzer":"keylower" }, 
      "marketBaseRate":{"type":"double"}, 
      "discountAllowed":{"type","boolean"}, 
      "wallet":{"type":"string", "analyzer":"keylower"}, 
      "rules":{"type":"string"}, 
      "rulesHasDate":{"type","boolean"}, 
      "clarifications":{"type":"string"} 
     }, 
     "runners":{ 
      "selectionId":{"type":"long"}, 
      "runnerName":{"type":"string", "analyzer":"keylower"}, 
      "handicap":{"type":"double"}, 
      "metadata":{ 

      } 
     } 
    } 
} 

}

medatadataDictionary<string,string>从API来和它可以包含像数据:

<"TRAINER_NAME", "John">, <"WEARING", "Wearing one">,.... 

将数据存储到类型是不是一个大问题,但问题是如何定义字典的映射。

任何帮助将节省我很多时间,并会让我学习映射创作更好的方法。

在此先感谢。

回答

2

Elasticsearch中的每个字段都可以是一个奇异值或一组值。这包括对象:

"metadata" : { 
    "type" : "object", 
    "properties" : { 
    "key" : { "type" : "string", "index" : "not_analyzed" }, 
    "value" : { "type" : "string", "index" : "not_analyzed" } 
    } 
} 

然后,如果你的JSON看起来是这样,这将是上述映射回升:

{ 
    ..., 
    "metadata": [ 
    { "key" : "TRAINER_HOME", "value" : "John" }, 
    { "key" : "WEARING", "value" : "Wearing one" } 
    ] 
} 

或者,如果你甚至不希望搜索的数据,但是您希望将它作为_source的一部分接受到索引中,但实际上并不索引各个字段(如果您实际上不打算使用元数据进行搜索,则会减小索引的大小):

{ 
    "metadata" : { 
    "type" : "object", 
    "dynamic" : false 
    } 
} 

这意味着你不能对ES内部的数据做任何事情,但当你对其他字段进行查询时,它会在那里。

如果你真正想要搜索的元数据,那么你可能使用"type" : "nested" rather than object(一定要采取注意到在底部严重,没有什么是免费的)。

+0

你的建议奏效。非常感谢 –