一尘不染

从Couchbase存储桶复制到Elasticsearch索引时出现问题?

elasticsearch

这个问题似乎与在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另一个人的事实。

但是,如果我将这两个对象存储在一个沙发基存储桶中(而不是直接存储到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我最初尝试的方法。映射工作。


阅读 261

收藏
2020-06-22

共1个答案

一尘不染

这是您必须在Elasticsearch方面解决的问题。

如果相同的字段名称可以同时包含数字值和字符串值,则应首先创建一个映射,该映射age为String。因此elasticsearch不会尝试自动猜测该字段的类型。

希望这可以帮助

2020-06-22