es 父子文档 父子排序 nativeSearchQueryBuilder实现
时间: 2024-01-27 15:03:36 浏览: 144
Elasticsearch 中的父子文档可以通过 `parent` 字段来建立关联,可以使用 `has_parent` 或 `has_child` 查询来查询父文档或子文档。
对于父子文档的排序,可以使用 `nested` 或 `has_child` 排序来实现。在 `nativeSearchQueryBuilder` 中,可以使用 `addSort` 方法来添加排序条件。
下面是一个使用 `nativeSearchQueryBuilder` 实现父子文档和排序的示例代码:
```java
// 创建父子文档索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("my_index");
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("parent_doc")
.startObject("properties")
.startObject("title")
.field("type", "text")
.endObject()
.endObject()
.endObject()
.startObject("child_doc")
.startObject("_parent")
.field("type", "parent_doc")
.endObject()
.startObject("properties")
.startObject("tag")
.field("type", "text")
.endObject()
.endObject()
.endObject()
.endObject();
createIndexRequest.mapping(mappingBuilder);
// 添加父子文档数据
IndexRequest parentDocRequest = new IndexRequest("my_index", "parent_doc", "1")
.source("title", "parent document");
IndexRequest childDocRequest1 = new IndexRequest("my_index", "child_doc", "2")
.source("tag", "tag1")
.parent("1");
IndexRequest childDocRequest2 = new IndexRequest("my_index", "child_doc", "3")
.source("tag", "tag2")
.parent("1");
BulkRequest bulkRequest = new BulkRequest()
.add(parentDocRequest)
.add(childDocRequest1)
.add(childDocRequest2);
client.bulk(bulkRequest, RequestOptions.DEFAULT);
// 查询父文档和子文档,并按父文档的 title 排序
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder()
.withQuery(has_child_query("child_doc", match_all_query()))
.withSort(SortBuilders.fieldSort("title").order(SortOrder.ASC));
SearchHits hits = client.search(searchQueryBuilder.build(), RequestOptions.DEFAULT).getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
```
在上面的示例中,首先创建了一个包含父子文档的索引,并添加了一些测试数据。然后使用 `has_child_query` 查询来查询所有包含子文档的父文档,并按父文档的 title 属性升序排序。最后输出查询结果。
阅读全文