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 ?
See Question&Answers more detail:
os