此问题似乎与在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”, “有效期”:0, “标志”: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
方法。映射有效。
答案 0 :(得分:5)
这是你必须在弹性搜索方面解决的问题。
如果相同的字段名称可以包含数值和字符串值,则应首先创建一个映射,表明age
是一个字符串。
因此elasticsearch不会尝试自动猜测该字段的类型。
希望这有帮助