2016-06-06 2 views
0

Я извлекаю данные о рынке данных из betfair api-ng, и я хочу сохранить его в elasticsearch (v1.4.4).Определить отображение elasticsearch для словаря, исходящего из удаленного api

Данные, поступающие из 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":{ 

      } 
     } 
    } 
} 

}

The medatadata является Dictionary<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

Ваше предложение сработало. Большое спасибо –