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 :
@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 }
And
class B { // some normal pojo }
When I let spring-data do the mapping, I get :
"a": { "properties": { "bs": { "properties": { "someBProperty": { "type": "string" }, "BId": { "type": "string" } } }, "id": { ... }, ... }
When I am trying to query the document, I get the classical inner vs nested documents problems and it doesn't recognize the nested element.
When I try to update mapping to use nested document I get "can't be changed from non-nested to nested".
Should I tell spring-data-es somehow that @NestedField => type: "nested" into mapping ? Is there a way to add custom mapping to spring-data when it create index & mapping ?
Also, I am initializing indexes via :
elasticsearchTemplate.deleteIndex(A.class); elasticsearchTemplate.createIndex(A.class); elasticsearchTemplate.putMapping(A.class); elasticsearchTemplate.refresh(A.class,true);
And then querying using spring-data repository :
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);
Here the res has 0 element in the Iterable but via REST I get the error on the nested query not supported (as I don't have it in mapping).
finally,
Does Spring-Data-ElasticSearch supports nested mappings via ES QueryBuilders API ? When should I make that mapping happens ?