这可能是我要尝试的真正特殊的事情。我正在运行“河流”以动态索引我的ouchdb中的所有数据。
当多个用户将数据输入系统时,有时会在映射(MapperParser Error
)中发生冲突。例如:
{"tweet" : {"fooval" : "1"}}
-elasticSearch为此tweet.fooval
变量创建一个Mapping为数字(因为它将其解释为数字){"tweet" : {"fooval" : "false"}}
-elasticSearch尝试为此tweet.fooval
变量创建一个映射,分别为 bool(boolean) (因为它将其解释为 bool(boolean) 值)和,因此创建MapperParser错误。 我想你看到了问题。另外,我只想在标量类型级别执行此操作,因为我不希望将数组/对象视为字符串。我希望在创建映射时将所有标量类型都视为字符串。
我在文档页面或论坛上找不到任何内容,因此,我会在这里询问指导/指针。
最佳答案
首先,默认情况下,elasticsearch不解析字符串。因此,如果您将以下JSON传递给elasticsearch:{"tweet": {"fooval": "1"}}
,它将tweet.fooval
视为字符串。如果elaticsearch正在解析字符串,请确保在mapping中将numeric_detection
和date_detection
设置为false。
另一方面,如果elasticsearch收到一个像JSONt这样的值作为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"