这个问题似乎与在couchbase中使用XDCR有关.如果我有以下简单的对象
1: { "name" : "Mark", "age" : 30} 2: { "name" : "Bill", "age" : "forty"}
并设置弹性搜索索引
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
另一个人的事实.
但是,如果我将这两个对象存储在couchbase存储桶中(而不是直接进入elasticsearch)并设置XDCR,则第一个对象复制正常但第二个对象失败并出现以下错误
未能执行批量项目(索引)索引{[test] [couchbaseDocument] [2],来源[{"doc":{"name":"Bill","age":"forty"},"meta":{ "id":"2","rev":"8-00000b9360d0a0bf0000000000000000","expiration":0,"flags":0}}]} org.elasticsearch.index.mapper.MapperParsingException:无法解析[doc.age ]
我无法弄清楚为什么它通过REST API工作,但不能在couchbase复制相同的对象时.
我按照答案并使用以下映射通过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
我最初尝试的方法.映射有效.
这是你必须在弹性搜索方面解决的问题.
如果相同的字段名称可以包含数值和字符串值,则应首先创建一个表示age
为String 的映射.因此elasticsearch不会尝试自动猜测该字段的类型.
希望这可以帮助