这可能是我想要做的非常奇怪的事情。我正在运行一条“河流”来动态索引我的couchdb中的所有数据
当多个用户将数据输入系统时,有时映射中存在冲突(MapperParser Error
)。例如:
{"tweet" : {"fooval" : "1"}}
- elasticSearch为此tweet.fooval
变量创建一个映射为数字(因为它将其解释为数字){"tweet" : {"fooval" : "false"}}
- elasticSearch尝试为此tweet.fooval
变量创建映射为布尔(因为它将其解释为布尔值)和因此导致MapperParser错误。 我猜你看到了问题。另外我只想在标量类型的级别上进行,因为我不希望将数组/对象视为字符串。我希望在创建映射时将所有标量类型视为字符串。
我在文档页面或论坛上找不到任何内容,所以我想在这里询问方向/指针。
答案 0 :(得分:2)
首先,默认情况下,elasticsearch不会解析字符串。因此,如果您将传递给elasticsearch以下JSON:{"tweet": {"fooval": "1"}}
它会将tweet.fooval
视为字符串。如果elaticsearch正在解析字符串,请确保mapping中的numeric_detection
和date_detection
设置为false。
另一方面,如果elasticsearch收到一个值为JSON的值,如下所示:{"tweet": {"fooval": 1}}
,elasticsearch确实会将此字段映射为long或double。您可以使用dynamic_templates覆盖此行为。这是一个例子:
curl -XPUT localhost:9200/test-idx -d '{
"settings": {
"index.number_of_replicas": 0,
"index.number_of_shards": 1
},
"mappings": {
"doc": {
"dynamic_templates" : [
{
"template_obj" : {
"match" : "*",
"match_mapping_type" : "object",
"mapping" : {
"type" : "object"
}
}
},
{
"template_str" : {
"match" : "*",
"mapping" : {
"type" : "string"
}
}
}
]
}
}
}'
curl -XPUT localhost:9200/test-idx/doc/1 -d '{
"count": 123,
"sold": false,
"date": "2009-11-15T14:12:12",
"price": 12.3,
"description": {
"weight": 42.3,
"size": {
"lenght": 30,
"width": 20,
"hight": 10
}
}
}'
echo
curl "localhost:9200/test-idx/doc/_mapping?pretty=true"