2013-09-16 19 views
5

Sto usando spring-data-elasticsearch e elasticsearch insieme per interrogare i documenti. Mi piacerebbe fare query annidate su documenti annidati.Ricerca elastica dati primaverili con campi nidificati e mappatura

ho questo in Java:

@Document(indexName = "as", type = "a", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") 
class A { 

    @Id 
    private String Id; 

    @Field(type = String, index = analyzed, store = true) 
    private String field1; 

    // ... Many more Fields. 

    @NestedField(type = FieldType.Object, index = analyzed, store = true, dotSuffix = "accounts") 
    private List<B> bs; 

    // ... getters and setters 
} 

E

class B { // some normal pojo } 

Quando ho lasciato a molla dati faccio la mappatura, ottengo:

"a": { 
    "properties": { 
     "bs": { 
      "properties": { 
       "someBProperty": { 
        "type": "string" 
       }, 
       "BId": { 
        "type": "string" 
       } 
      } 
     }, 
     "id": { ... }, 
     ... 
} 

Quando sto cercando di interrogare il documento, ottengo i classici problemi di documenti interni vs nidificati e non riconosce l'elemento nidificato.

Quando si tenta di aggiornare la mappatura per utilizzare il documento annidato, "non può essere modificato da non annidato a nidificato".

Devo dire in qualche modo ai dati di primavera che @NestedField => tipo: "annidato" nella mappatura? C'è un modo per aggiungere la mappatura personalizzata ai dati primaverili quando crea la mappatura dell'indice &?

Inoltre, sto in fase di inizializzazione indici via:

elasticsearchTemplate.deleteIndex(A.class); 
elasticsearchTemplate.createIndex(A.class); 
elasticsearchTemplate.putMapping(A.class); 
elasticsearchTemplate.refresh(A.class,true); 

E poi l'interrogazione utilizzando repository primavera-dati:

QueryBuilder builder = QueryBuilders.nestedQuery("bs", QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("as.field1", "A1")).must(QueryBuilders.matchQuery("as.field2", "B1"))); 

Iterable<DenormalizedRelationshipDocument> res = aRepository.search(builder); 

Qui le res ha 0 elemento del Iterable ma via REST ho la errore sulla query nidificata non supportata (poiché non la ho nella mappatura).

infine,

fa primavera-Data-elasticsearch supporta mappature annidati via ES QueryBuilders API? Quando dovrei fare che la mappatura avvenga?

risposta

9

elasticsearch dati Primavera ora supporta la maggior parte del set di funzionalità comuni di elasticsearch tra cui nidificati, oggetti interni e il Bambino Parent (di recente)

spiegazione dettagliata sono disponibili all'indirizzo managing relationship in elasticsearch

documento nidificato Esempio

persona Entity

@Document(indexName = "person" , type = "user") 

    public class Person { 

     @Id 
     private String id; 

     private String name; 

     @Field(type = FieldType.Nested) 
     private List<Car> car; 

     // setters-getters 

    } 

auto Entity



    public class Car { 
    private String name; 
    private String model; 
    //setters and getters 
    } 

Impostazione dati



    Person foo = new Person(); 
    foo.setName("Foo"); 
    foo.setId("1"); 

    List cars = new ArrayList(); 
    Car subaru = new Car(); 
    subaru.setName("Subaru"); 
    subaru.setModel("Imprezza"); 
    cars.add(subaru); 
    foo.setCar(cars); 

indicizzazione



     IndexQuery indexQuery = new IndexQuery(); 
     indexQuery.setId(foo.getId()); 
     indexQuery.setObject(foo); 

     //creating mapping 
     elasticsearchTemplate.putMapping(Person.class); 
     //indexing document 
     elasticsearchTemplate.index(indexQuery); 
     //refresh 
     elasticsearchTemplate.refresh(Person.class, true); 

Ricerca



    QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name",  "subaru")).must(termQuery("car.model", "imprezza"))); 

    SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); 
    List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); 

è possibile trovare ulteriori casi di test su nidificati e oggetto interno al Nested Object Tests

+0

ti invitiamo a suggerire un metodo che utilizza @ query di annotazione per la stessa. –

+0

Puoi suggerire un metodo per disattivare _source usando i dati di primavera? – Sachin

+0

SearchQuery searchQuery = new NativeSearchQueryBuilder(). WithFields() metodo se si desidera solo campi specifici. –

Problemi correlati