2014-02-06 2 views
2

Эта проблема, похоже, связана с использованием XDCR в couchbase. Если бы я имел следующие простые объектыПроблемы при репликации с ковша couchbase в индекс elasticsearch?

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 для другого.

Если, однако, я сохранил эти два объекта в 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]

Я не могу понять, почему он работает через API REST, но не тогда, когда 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, который я изначально пытался. Отображение работает.

ответ

4

Это то, что вам нужно решить на стороне elasticsearch.

Если одно и то же имя поля может содержать как числовые значения, так и строковые значения, сначала необходимо создать сопоставление, в котором говорится, что age является строкой. Таким образом, elasticsearch не будет пытаться автоматически указывать тип для этого поля.

Надеется, что это помогает

+0

Что бы я в ситуации, когда 'age' поле не не введено только после отображения были определены так что сначала введен как число, отображение обновляется, но затем его происходит как строка? В этом сценарии я не могу указать, чтобы он рассматривался как строка в исходном сопоставлении, потому что я не знаю, что это будет происходить как свойство. Имеет ли это смысл? –

+1

Не получится. Первый документ, имеющий это поле, даст тип. И вы не можете изменить тип. Можно использовать шаблон, вы можете сказать, что все поля должны рассматриваться как строки. – dadoonet

Смежные вопросы