2015-04-07 17 views
11

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.

risposta

14

Potrei finalmente replicare e risolvere il problema. Il fatto è che stavo usando ElasticTemplate per l'indicizzazione e la ricerca di documenti invece di repository, perché la mia logica di business è diventata più complicata (uso di aggregazioni, ecc.).

Dopo di che, ho rimosso l'OperationDocumentRespository inutilizzato. Sembra che il repository sia necessario per il mapping del tipo che viene inviato al server ES all'avvio. Pensavo che avere la classe @Document dovrebbe essere sufficiente, ma non lo è.

Quindi abbiamo due opzioni qui:

  • Mantenere l'OperationDocumentRepository
  • Aggiungere questa linea per l'avvio app:

    elasticsearchTemplate.putMapping(OperationDocument.class); 
    
1

Ho provato a replicare il problema utilizzando l'applicazione di esempio elasticsearch di dati di primavera, ma come per la configurazione sto ottenendo i risultati desiderati come menzionato sopra.

intero codice è impegnata a proiettare qui ->link

sguardo al TestCase che generano indice e applicare la mappatura quando il contesto caricato a molla ->link

Qui è mappatura generata da TestCase:

{ 
    "operations" : { 
    "aliases" : { }, 
    "mappings" : { 
     "operation" : { 
     "properties" : { 
      "dateUp" : { 
      "type" : "date", 
      "store" : true, 
      "format" : "dd.MM.yyyy hh:mm" 
      }, 
      "operationName" : { 
      "type" : "string", 
      "store" : true, 
      "analyzer" : "standard" 
      }, 
      "sectors" : { 
      "type" : "nested" 
      }, 
      "someTransientData" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
      } 
     } 
     } 
    }, 
    "settings" : { 
     "index" : { 
     "refresh_interval" : "1s", 
     "number_of_shards" : "5", 
     "store" : { 
      "type" : "fs" 
     }, 
     "creation_date" : "1428677234773", 
     "number_of_replicas" : "1", 
     "version" : { 
      "created" : "1040499" 
     }, 
     "uuid" : "-djzLu-IQ0CBs-M6R0-R6Q" 
     } 
    }, 
    "warmers" : { } 
    } 
} 

Puoi creare esempio simile con avvio molla con https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-elasticsearch

e impegnarsi su condivisione pubblica?

+0

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

+0

Potrei finalmente replicare e risolvere il problema. Ho pubblicato la ragione e la soluzione in un'altra risposta. – WinterN

Problemi correlati