为来自远程 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(确保认真对待底部的注释;没有免费的东西。