2013-09-16 2 views
5

के साथ स्प्रिंग डेटा लोचदार खोज मैं प्रश्न दस्तावेजों के लिए वसंत-डेटा-लोचदार खोज और लोचदार खोज का उपयोग कर रहा हूं। मैं नेस्टेड दस्तावेजों पर नेस्टेड प्रश्न करना चाहता हूं।नेस्ड फ़ील्ड और मैपिंग

मैं जावा में इस है:

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

और

class B { // some normal pojo } 

जब मैं वसंत-डेटा मानचित्रण, मैं मिलता है:

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

जब मैं कोशिश कर रहा हूँ दस्तावेज़ से पूछताछ करें, मुझे शास्त्रीय आंतरिक बनाम नेस्टेड दस्तावेज़ समस्याएं मिलती हैं और यह नेस्टेड तत्व को पहचान नहीं पाती है।

जब मैं नेस्टेड दस्तावेज़ का उपयोग करने के लिए मैपिंग अपडेट करने का प्रयास करता हूं तो मुझे "गैर-नेस्टेड से नेस्टेड में बदला नहीं जा सकता"।

क्या मुझे वसंत-डेटा-एस को किसी भी तरह से कहना चाहिए कि @NestedField => टाइप: "नेस्टेड" मैपिंग में? क्या यह सूचकांक & मैपिंग बनाते समय वसंत-डेटा में कस्टम मैपिंग जोड़ने का कोई तरीका है?

इसके अलावा, मैं के माध्यम से अनुक्रमित आरंभ कर रहा हूँ:

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

और फिर वसंत-डाटा भंडार का उपयोग कर क्वेरी करने:

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

यहाँ रेस Iterable में लेकिन बाकी के माध्यम से 0 तत्व है मैं नेस्टेड क्वेरी पर त्रुटि समर्थित नहीं है (क्योंकि मेरे पास मैपिंग में नहीं है)।

अंत में,

करता वसंत-डाटा-ElasticSearch ES QueryBuilders एपीआई के माध्यम से नेस्टेड मैपिंग का समर्थन करता है? मुझे यह मैपिंग कब करना चाहिए?

उत्तर

9

स्प्रिंग डेटा elasticsearch अब समर्थन करता है, नेस्टेड, इनर वस्तुओं और जनक चाइल्ड (हाल ही में)

विस्तृत विवरण managing relationship in elasticsearch में पाया जा सकता

नेस्टेड दस्तावेज़ उदाहरण

सहित elasticsearch के आम सुविधा सेट के सबसे

व्यक्ति इकाई

@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 

    } 

कार इकाई



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



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

डाटा

स्थापना अनुक्रमण



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

सर्च कर रहे हैं



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

आप Nested Object Tests

+0

पर नेस्ट और इनर वस्तु के बारे में और परीक्षण मामलों पाते हैं कि आप एक विधि उसी के लिए @query एनोटेशन उपयोग करने का सुझाव कृपया कर सकते हैं कर सकते हैं। –

+0

क्या आप वसंत डेटा es का उपयोग करके _source बंद करने के लिए एक विधि सुझा सकते हैं? – Sachin

+0

SearchQuery searchQuery = new nativeSearchQueryBuilder()। फ़ील्ड() विधि के साथ यदि आप केवल विशिष्ट फ़ील्ड चाहते हैं। –

संबंधित मुद्दे