为来自远程 api 的字典定义弹性搜索映射
Define elasticsearch mapping for a dictionary coming from the remote api
我正在从 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":{
}
}
}
}
}
medatadata 是来自 API 的 Dictionary<string,string>
,它可以包含如下数据:
<"TRAINER_NAME", "John">, <"WEARING", "Wearing one">,....
将数据存储到类型中不是什么大问题,但问题是如何定义字典的映射。
任何帮助都会节省我很多时间,并且会让我更好地学习映射创建。
提前致谢。
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(确保认真对待底部的注释;没有免费的东西。
我正在从 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":{
}
}
}
}
}
medatadata 是来自 API 的 Dictionary<string,string>
,它可以包含如下数据:
<"TRAINER_NAME", "John">, <"WEARING", "Wearing one">,....
将数据存储到类型中不是什么大问题,但问题是如何定义字典的映射。
任何帮助都会节省我很多时间,并且会让我更好地学习映射创建。
提前致谢。
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(确保认真对待底部的注释;没有免费的东西。