elasticsearch 弹性搜索映射器无法分析元素集合,elasticsearch,spring-boot,elasticsearch,Spring Boot" /> elasticsearch 弹性搜索映射器无法分析元素集合,elasticsearch,spring-boot,elasticsearch,Spring Boot" />

elasticsearch 弹性搜索映射器无法分析元素集合

elasticsearch 弹性搜索映射器无法分析元素集合,elasticsearch,spring-boot,elasticsearch,Spring Boot,我有一个实体: @Entity public class Person { @Id @GeneratedValue private Long id; private String name; private String surname; @ElementCollection @CollectionTable(name = "EMAIL_ADDRESSES", joinColumns=@JoinColumn(name="PERSON_I

我有一个实体:

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String surname;

    @ElementCollection
    @CollectionTable(name = "EMAIL_ADDRESSES", joinColumns=@JoinColumn(name="PERSON_ID"))
    private Set<EmailAddress> emailAddresses = new HashSet<>();

    ...
    constructurs
    getters&setters
    ...

}
我想做的是在elasticsearch上创建一个索引,其中包含Person类型。我正在使用XContentBuilder构建要发送的json对象

public void addIndex(Person person) { 

    IndexResponse response = this.elasticsearchClient.prepareIndex("persons", "person", "1")
        .setSource(buildPersonObject(person)).get();

}

private XContentBuilder buildPersonObject(Person person) {
    XContentBuilder builder = jsonBuilder().startObject()
            .field("id", person.getId())
            .field("name", person.getName())
            .field("surname", person.getSurname());

    if (person.getEmailAddresses().size() > 0) {
        builder.startArray("emailAddresses");
        for (EmailAddress emailAddress : person.getEmailAddresses()) {
            builder.startObject();
            builder.field("label", emailAddress.getLabel());
            builder.field("email", emailAddress.getEmail());
            builder.endObject();
        }
        builder.endArray();
    }
    builder.endObject();
    return builder;
}
它抛出如下异常:

Caused by: org.elasticsearch.index.mapper.MapperParsingException: failed to parse [emailAddresses] at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:329)
at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:309)
at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:326)
at org.elasticsearch.index.mapper.DocumentParser.parseNonDynamicArray(DocumentParser.java:414)
at org.elasticsearch.index.mapper.DocumentParser.parseArray(DocumentParser.java:379)
at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:254)
at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:122)
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:309)
at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:580)
at org.elasticsearch.index.shard.IndexShard.prepareIndexOnPrimary(IndexShard.java:559)
at org.elasticsearch.action.index.TransportIndexAction.prepareIndexOperationOnPrimary(TransportIndexAction.java:212)
at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:224)
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:158)
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66)
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:639)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279)
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:271)
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
... 1 common frames omitted

Caused by: java.lang.IllegalArgumentException: unknown property [label]
at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateFieldForString(StringFieldMapper.java:362)
at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateField(StringFieldMapper.java:311)
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:321)
当使用EmailAddress作为@OneToMany关系而不是@ElementCollection时,上述代码可以正常工作

那么,如何将@Embeddeble类与elasticsearch映射器结合使用呢

Caused by: org.elasticsearch.index.mapper.MapperParsingException: failed to parse [emailAddresses] at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:329)
at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:309)
at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:326)
at org.elasticsearch.index.mapper.DocumentParser.parseNonDynamicArray(DocumentParser.java:414)
at org.elasticsearch.index.mapper.DocumentParser.parseArray(DocumentParser.java:379)
at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:254)
at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:122)
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:309)
at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:580)
at org.elasticsearch.index.shard.IndexShard.prepareIndexOnPrimary(IndexShard.java:559)
at org.elasticsearch.action.index.TransportIndexAction.prepareIndexOperationOnPrimary(TransportIndexAction.java:212)
at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:224)
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:158)
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66)
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:639)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279)
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:271)
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
... 1 common frames omitted

Caused by: java.lang.IllegalArgumentException: unknown property [label]
at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateFieldForString(StringFieldMapper.java:362)
at org.elasticsearch.index.mapper.core.StringFieldMapper.parseCreateField(StringFieldMapper.java:311)
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:321)