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": { ... },
...
}
ドキュメントをクエリしようとすると、従来の内部ドキュメントとネストされたドキュメントの問題が発生し、ネストされた要素が認識されません。
ネストされたドキュメントを使用するようにマッピングを更新しようとすると、「ネストされていないドキュメントからネストされたドキュメントに変更できません」というメッセージが表示されます。
@NestedField => type: "nested" into mapping ということを spring-data-es にどうにかして伝える必要がありますか? インデックスとマッピングを作成するときに、カスタム マッピングを spring-data に追加する方法はありますか?
また、次の方法でインデックスを初期化しています。
elasticsearchTemplate.deleteIndex(A.class);
elasticsearchTemplate.createIndex(A.class);
elasticsearchTemplate.putMapping(A.class);
elasticsearchTemplate.refresh(A.class,true);
次に、spring-data リポジトリを使用してクエリを実行します。
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);
ここで res には Iterable の要素が 0 ありますが、REST を介してサポートされていないネストされたクエリでエラーが発生します (マッピングにないため)。
最後に、
Spring-Data-ElasticSearch は、ES QueryBuilders API を介してネストされたマッピングをサポートしていますか? そのマッピングをいつ行う必要がありますか?