2013-09-16 12 views
5

Używam sprężynowych danych, elastycznych wyszukań i elastycznych wyszukań, aby wyszukiwać dokumenty. Chciałbym zagnieżdżone zapytania w zagnieżdżonych dokumentach.Wiosenne dane Elastic Search z zagnieżdżonymi polami i mapowaniem

mam to w 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 
} 

I

class B { // some normal pojo } 

Kiedy niech wiosenne dane zrobić mapowanie, otrzymuję:

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

Kiedy próbuję zapytaj dokument, dostaję problemy z klasycznymi wewnętrznymi a zagnieżdżonymi dokumentami i nie rozpoznaję zagnieżdżonego elementu.

Gdy próbuję zaktualizować mapowanie, aby użyć zagnieżdżonego dokumentu, otrzymam "nie można zmienić z nieprzenoszonego na zagnieżdżony".

Czy powinienem przekazać dane sprężynowe w jakiś sposób, że @NestedField => type: "nested" do mapowania? Czy istnieje sposób na dodanie niestandardowego mapowania do danych sprężyn podczas tworzenia mapowania indeksu &?

Również jestem inicjowanie indeksów poprzez:

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

A potem zapytań za pomocą repozytorium wiosna-data:

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); 

Tu res ma 0 elementem iterowalny ale poprzez REST otrzymuję błąd w zapytaniu zagnieżdżonym nie jest obsługiwany (ponieważ nie mam go w odwzorowaniu).

wreszcie

Does Wiosna-Data-ElasticSearch obsługuje zagnieżdżone mapowania za pośrednictwem ES QueryBuilders API? Kiedy powinienem wykonać to mapowanie?

Odpowiedz

9

Wiosna dane elasticsearch obsługuje teraz większość wspólnego zestawu funkcji elasticsearch tym zagnieżdżonych obiektów wewnętrzny i Dziecka dominującej (ostatnio)

Szczegółowe wyjaśnienie można znaleźć w managing relationship in elasticsearch

przykładzie zagnieżdżony dokument

Osoba podmiotu

@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 

    } 

samochodów Podmiot



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

Konfigurowanie danych



    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); 

indeksowania



     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); 

wyszukiwania



    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); 

można znaleźć więcej przypadków testowych o zagnieżdżonych i przedmiot Wewnętrznej w Nested Object Tests

+0

można zasugerować sposób wykorzystujący @query adnotacji dla tego samego. –

+0

Czy możesz zaproponować metodę wyłączenia _source przy użyciu danych sprężynowych? – Sachin

+0

SearchQuery searchQuery = new NativeSearchQueryBuilder(). WithFields() metoda, jeśli chcesz tylko określone pola. –