这个问题似乎与在Couchbase中使用XDCR有关。如果我有以下简单对象
1: { "name" : "Mark", "age" : 30} 2: { "name" : "Bill", "age" : "forty"}
并设置一个Elasticsearch索引
curl -XPUT 'http://localhost:9200/test/couchbaseDocument/_mapping' -d ' { "couchbaseDocument" : { "dynamic_templates": [ { "store_generic": { "match": "*", "mapping": { "store": "yes" } } } ] } }'
然后,我可以使用REST API将两个对象添加到该索引中
curl -XPUT localhost:9200/test/couchbaseDocument/1 -d '{ "name" : "Mark", "age" : 30 }' curl -XPUT localhost:9200/test/couchbaseDocument/2 -d '{ "name" : "Bill", "age" : "forty" }'
它们现在都可以搜索(尽管“年龄”是long一个人和string另一个人的事实。
long
string
但是,如果我将这两个对象存储在一个沙发基存储桶中(而不是直接存储到elasticsearch中)并设置了XDCR,则第一个对象可以很好地复制,但是第二个对象会失败,并出现以下错误
无法执行批量项目(索引)索引{[test] [couchbaseDocument] [2],源[{“ doc”:{“ name”:“ Bill”,“ age”:“ forty”},“ meta”:{ “ id”:“ 2”,“ rev”:“ 8-00000b9360d0a0bf0000000000000000”,“到期”:0,“标志”:0}}}}} org.elasticsearch.index.mapper.MapperParsingException:无法解析[doc.age ]
我无法弄清楚为什么它可以通过REST API来工作,但是当沙发床复制相同的对象时却不能。
我遵循了答案,并使用以下映射通过XDCR使其正常工作
curl -XPUT 'http://localhost:9200/test/couchbaseDocument/_mapping' -d ' { "couchbaseDocument" : { "properties" : { "doc": { "properties" : { "name" : {"type" : "string", "store" : "yes"}, "age" : {"type" : "string", "store" : "yes"} } } } } }'
现在,所有对象(尽管相同字段的类型不同)都可以复制并搜索。我认为没有必要包括dynamic_templates我最初尝试的方法。映射工作。
dynamic_templates
这是您必须在Elasticsearch方面解决的问题。
如果相同的字段名称可以同时包含数字值和字符串值,则应首先创建一个映射,该映射age为String。因此elasticsearch不会尝试自动猜测该字段的类型。
age
希望这可以帮助