我正在使用spring-data-elasticsearch和elasticsearch一起查询文档。我想在嵌套文档上执行嵌套查询。
我在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
}
而且
class B { // some normal pojo }
当我让spring-data进行映射时,我得到:
"a": {
"properties": {
"bs": {
"properties": {
"someBProperty": {
"type": "string"
},
"BId": {
"type": "string"
}
}
},
"id": { ... },
...
}
当我尝试查询文档时,出现了内部文档和嵌套文档的经典问题,并且它无法识别嵌套元素。
当我尝试更新映射以使用嵌套文档时,会出现“无法从非嵌套更改为嵌套”的错误。
我应该如何告诉spring-data-es将@NestedField => type: "nested"添加到映射中?在spring-data创建索引和映射时,有没有添加自定义映射的方法?
此外,我是通过以下方式初始化索引的:
elasticsearchTemplate.deleteIndex(A.class);
elasticsearchTemplate.createIndex(A.class);
elasticsearchTemplate.putMapping(A.class);
elasticsearchTemplate.refresh(A.class,true);
然后使用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);
在这里,Iterable中的res没有元素,但是通过REST获取嵌套查询不受支持的错误(因为它不在映射中)。
最后,
Spring-Data-Elasticsearch是否支持通过ES QueryBuilders API进行嵌套映射?我应该在什么时候进行映射?