2013-09-16 26 views
5

Yaylı veri-elasticsearch ve elasticsearch ile birlikte belgeleri sorgulamak için kullanıyorum. İç içe geçmiş belgeler üzerinde iç içe geçmiş sorgular yapmak istiyorum.Yay Verili Elastik Arama İç İçe Aktarılan Alanlar ve eşleme

ben java bu var: Bahar-veri eşlemesi yapmak izin yaparken

@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 
} 

Ve

class B { // some normal pojo } 

, alıyorum: Ben çalışıyorum zaman

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

Belge sorgulamak, klasik iç ve iç içe geçmiş belgeler sorunları alıyorum ve yuvalanmış öğeyi tanımıyor.

İç içe geçmiş belgeyi kullanmak için eşlemeyi güncellemeyi denediğimde, "iç içe geçmişten iç içe geçmişe dönüştürülemez".

Spring-data-es'e bir şekilde @NestedField => türünü eşlemeye "iç içe" koyduğunu söylemeliyim? Dizin & eşlemesi oluşturulduğunda yay verisine özel eşleme eklemenin bir yolu var mı?

Ayrıca, ben üzerinden dizinleri başlatılıyor ediyorum:

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

Ve sonra yay veri deposunu kullanarak sorgulama: İşte DİNLENME iterable ama aracılığıyla 0 eleman almak etti res

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

iç içe geçmiş sorgudaki hata desteklenmiyor (haritalamada bulunmadığım için). Sonunda

,

mu İlkbahar-Veri-ElasticSearch ES QueryBuilders API üzerinden iç içe eşleştirmeleri destekler? Bu haritalamayı ne zaman yapmalıyım?

cevap

9

Yay veri elasticsearch şimdi destekler, iç içe İç Nesneler ve (son) ebeveyn çocuk

Ayrıntılı açıklama managing relationship in elasticsearch bulunabilir

İç içe belge, Örnek

içeren elasticsearch ortak özellik kümesinin en

Kişi Varlık

@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 

    } 

Araç Varlık



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

aranıyor İndeksleme



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



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

Veri

Kurma



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

Eğer aynı için @query ek açıklamayı kullanarak bir yöntemi önermek misiniz Nested Object Tests

+0

de İç içe ve İç Nesne hakkında daha fazla test durumları bulabilirsiniz. –

+0

Lütfen kaynak verilerini kullanarak kaynak kodunu kapatmak için bir yöntem önerebilir misiniz? – Sachin

+0

SearchQuery searchQuery = new NativeSearchQueryBuilder(). Yalnızca belirli alanları istiyorsanız withFields() yöntemi. –

İlgili konular