2015-07-08 2 views
0

В моем приложении у меня есть класс, который расширен двумя другими классами. Эти два других класса сериализуются в json и индексируются по elasticsearch.Картирование для разных типов свойств

Проблема Я сталкиваются в том, что эти два класса, простирающиеся первый представить свойство с одним именем, но разными типами (одну строку, а другой один объект) следующим образом:

{ 
    "property1" : "a string", 
    "property2" : "another string" 
} 

{ 
    "property1" : "this is ok as the first one is string too", 
    "property2" : { 
     "propertyFromProperty2" : "this is not ok" 
    } 
} 

При индексировании I получают следующее исключение:

org.elasticsearch.index.mapper.MapperParsingException: failed to parse [property2] 
    at org.elasticsearch.index.mapper.core.AbstractFieldMapper.parse(AbstractFieldMapper.java:418) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeObject(ObjectMapper.java:517) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:459) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeObject(ObjectMapper.java:517) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:459) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeObject(ObjectMapper.java:517) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:459) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.serializeObject(ObjectMapper.java:517) 
    at org.elasticsearch.index.mapper.object.ObjectMapper.parse(ObjectMapper.java:459) 
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:515) 
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:462) 
    at org.elasticsearch.index.shard.service.InternalIndexShard.prepareCreate(InternalIndexShard.java:363) 
    at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:215) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:556) 
    at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1.run(TransportShardReplicationOperationAction.java:426) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: org.elasticsearch.ElasticsearchIllegalArgumentException: unknown property [propertyFromProperty2] 
    at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateFieldForString(StringFieldMapper.java:331) 
    at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateField(StringFieldMapper.java:277) 
    at org.elasticsearch.index.mapper.core.AbstractFieldMapper.parse(AbstractFieldMapper.java:408) 

Какие у меня варианты? Я могу, возможно, использовать тип поля с именем во избежание ошибок синтаксического анализа, возможно ли это с помощью elasticsearch?

Есть ли другое решение поэтому?

ответ

0

Как вы сказали, вы не можете этого сделать. После первого запроса на индексацию property2 получил тип string.

Когда вы пытаетесь выполнить второй запрос на индексацию, вы в основном пытаетесь проиндексировать тот же property2, но type object.

Это означает разные типы полей для одного и того же поля. Это невозможно в Elasticsearch.

В качестве вариантов: сделайте первый запрос индексации соответствующим object. Возможно, что-то вроде этого, но я не знаю особенностей вашего прецедента:

{ 
    "property1" : "a string", 
    "property2" : { 
     "something" : "another string" 
    } 
} 
Смежные вопросы