4

我正在从 betfair api-ng 获取市场目录数据,我想将其存储到 elasticsearch (v1.4.4)。

来自 API 的数据包含许多属性和复杂类型。有一个名为runners的复杂类型,其中包含相关数据和一个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":{

            }
        }
    }
}

}

数据数据来自Dictionary<string,string>API,它可以包含以下数据:

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

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

任何帮助都将节省我的大量时间,并使我以更好的方式学习映射创建。

提前致谢。

4

1 回答 1

4

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"而不是对象(请务必认真对待底部的注释;没有什么是免费的)。

于 2016-06-06T22:46:19.317 回答