Spring Data Elastic Search with Nested Fields and mapping Spring Data Elastic Search with Nested Fields and mapping elasticsearch elasticsearch

Spring Data Elastic Search with Nested Fields and mapping


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