A anotação @Field do Spring Data Elasticsearch não está funcionando
Eu tenho um aplicativo Spring Boot com o plug-in Spring Data Elasticsearch no pom.xml. Criei uma classe de documento que gostaria de indexar:
@Document(indexName = "operations", type = "operation")
public class OperationDocument {
@Id
private Long id;
@Field(
type = FieldType.String,
index = FieldIndex.analyzed,
searchAnalyzer = "standard",
indexAnalyzer = "standard",
store = true
)
private String operationName;
@Field(
type = FieldType.Date,
index = FieldIndex.not_analyzed,
store = true,
format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm"
)
private Date dateUp;
@Field(
type = FieldType.String,
index = FieldIndex.not_analyzed,
store = false
)
private String someTransientData;
@Field(type = FieldType.Nested)
private List<Sector> sectors;
//Getter and setters
Eu também criei um repositório para esta classe:
public interface OperationDocumentRepository
extends ElasticsearchRepository<OperationDocument, Long> {
}
Fiz um teste que indexa três objetos de amostra usando o repositório. É muito longo, então eu vou postar apenas é necessário. O fato é que o mapeamento criado no servidor ES ignora a configuração definida pelas anotações @Field:
"mappings": {
"operation": {
"properties": {
"operationName": {
"type": "string"
},
"dateUp": {
"type": "long"
},
"someTransientData": {
"type": "string"
},
"sectors": {
"properties": {
"id": {
"type": "long"
},
"sectorName": {
"type": "string"
}
}
}
}
}
}
Não há informações sobre os analisadores, "someTransientData" é armazenado e indexado e dateUp é digitado como Long em vez de Date.
Um documento de amostra solicitado diretamente do servidor:
{
"_index": "operations",
"_type": "operation",
"_id": "AUyUk2cY3nXeOFxdOlQW",
"_version": 1,
"_score": 1,
"_source": {
"id": null,
"operationName": "Second Operation Name",
"dateUp": 1428421827091,
"someTransientData": "Do not index or store",
"sectors": [
{
"id": 2,
"sectorName": "Health Care"
},
{
"id": 3,
"sectorName": "Construction"
}
]
}
}
Também observei que, quando executo o aplicativo pela segunda vez, no momento da inicialização, recebo esse erro, impresso apenas quando o índice já existe:
ERRO 19452 --- [principal] .dersAbstractElasticsearchRepository: falha ao carregar os nós elásticos de pesquisa: org.elasticsearch.index.mapper.MergeMappingException: mesclagem falhou com falhas {[mapper [someTransientData] possui valores de índice diferentes, o mapeador [someTransientData] possui tokenize diferente valores, o mapeador [someTransientData] possui um index_analyzer diferente, o mapeamento de objetos [setores] não pode ser alterado de não aninhado para aninhado, o mapeador [operationName] possui diferentes valores de armazenamento, o mapper [operationName] possui um index_analyzer diferente, o mapeador [dateUp] de diferentes tipo, current_type [long], mesclado_type [data]]}
É um bug do Spring Data Elastic Search ou estou fazendo algo errado?
Eu tentei a versão estável fornecida pelo boot de primavera e o último snapshot do spring-data-elasticsearch. Também tentei o servidor Elasticsearch incorporado fornecido pelo plug-in e um externo da versão atual. Eu sempre tenho os mesmos resultados.