Spring Data Elastic Search with Nested Fields and mapping

前端 未结 1 873
有刺的猬
有刺的猬 2020-12-08 08:37

I am using spring-data-elasticsearch and elasticsearch together to query documents. I\'d like to do nested queries on nested documents.

I have this in java :

相关标签:
1条回答
  • 2020-12-08 09:22

    Spring data elasticsearch now supports most of the common feature set of elasticsearch including Nested, Inner Objects and Parent Child(recently)

    Detailed explanation can be found at managing relationship in elasticsearch

    Nested document Example

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

    Car Entity

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

    Setting Up Data

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

    Indexing

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

    Searching

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

    you can find more test cases about Nested and Inner Object at Nested Object Tests

    0 讨论(0)
提交回复
热议问题