Ho un'applicazione Spring Boot con il plug-in Spring Data Elasticsearch nel pom.xml. Ho creato una classe di documento che mi piacerebbe index:Spring Data L'annotazione @Field di Elasticsearch non funziona
@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
Ho anche creato un repository per questa classe:
public interface OperationDocumentRepository
extends ElasticsearchRepository<OperationDocument, Long> {
}
ho fatto un test che indicizza tre oggetti di esempio utilizzando il repository. È piuttosto lungo quindi lo posterò solo è necessario. Il fatto è che la mappatura creato nel server ES ignora configurazione impostata dal annotazioni @Field:
"mappings": {
"operation": {
"properties": {
"operationName": {
"type": "string"
},
"dateUp": {
"type": "long"
},
"someTransientData": {
"type": "string"
},
"sectors": {
"properties": {
"id": {
"type": "long"
},
"sectorName": {
"type": "string"
}
}
}
}
}
}
Non v'è alcun informazioni analizzatori "someTransientData" è memorizzato e indicizzato, e dateUp è tipizzata come a lungo invece di Data .
Un documento di esempio richiesto direttamente dal server:
{
"_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"
}
]
}
}
Ho anche notato che quando faccio funzionare l'applicazione per la seconda volta, al momento dell'avvio ottengo questo errore, solo stampato quando l'indice esiste già:
ERRORE 19452 --- [principale] .dersAbstractElasticsearchRepository: è riuscito a caricare elasticsearch nodi: org.elasticsearch.index.mapper.MergeMappingException: un'unione fallita con fallimenti {[mapper [someTransientData] ha diversi valori di indice, mapper [someTransientData] ha un token diverso valori di enize, mapper [someTransientData] ha index_analyzer differente, mapping oggetto [settori] non può essere modificato da non annidato a nidificato, mapper [operationName] ha diversi valori di store, mapper [operationName] ha index_analyzer differente, mapper [dateUp] di diverso tipo, current_type [long], merged_type [date]]
È un errore di Spring Data Elastic Search o sto facendo qualcosa di sbagliato?
Ho provato la versione stabile fornita da avvio a molla e ultima istantanea di spring-data-elasticsearch. Ho anche provato il server Elasticsearch integrato fornito dal plug-in e uno esterno della versione corrente. Ho sempre avuto gli stessi risultati.
Ho provato il vostro esempio e ha funzionato. Poi ho creato un nuovo progetto Spring Boot e ha funzionato anche. Ora sto cercando di capire cosa rompe la mia prima applicazione. Aggiornerò il primo post se lo trovo. Grazie! – WinterN
Potrei finalmente replicare e risolvere il problema. Ho pubblicato la ragione e la soluzione in un'altra risposta. – WinterN