es 父子查询 排序 java NativeSearchQueryBuilder JoinQueryBuilders.hasChildQuery
时间: 2023-11-27 21:51:52 浏览: 54
Elasticsearch的父子查询可以通过Nested Query或者Has Child Query来实现。其中,Has Child Query可以在查询时返回与子文档匹配的父文档,同时还可以对返回的结果进行排序。下面是一个使用Java API进行Has Child Query排序的示例:
```java
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 构建子查询
QueryBuilder childQuery = QueryBuilders.matchQuery("childField", "childValue");
// 构建父查询
QueryBuilder parentQuery = JoinQueryBuilders.hasChildQuery("childType", childQuery, ScoreMode.Max);
// 将父查询添加到查询构建器中
queryBuilder.withQuery(parentQuery);
// 添加排序规则
queryBuilder.withSort(SortBuilders.fieldSort("parentField").order(SortOrder.DESC));
// 执行查询
SearchHits<ParentDoc> searchHits = elasticsearchRestTemplate.search(queryBuilder.build(), ParentDoc.class);
List<ParentDoc> parentDocs = searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
```
在上面的示例中,我们首先构建了一个子查询,然后使用JoinQueryBuilders.hasChildQuery方法构建了一个父查询,并将其添加到查询构建器中。接下来,我们使用SortBuilders.fieldSort方法添加了一个按照parentField字段降序排序的排序规则。最后,我们执行查询并获取结果。
需要注意的是,这里使用了ElasticsearchRestTemplate来执行查询,而不是直接使用TransportClient或者RestClient。如果你使用的是TransportClient或者RestClient,那么查询的结果将会是一个SearchResponse对象,你需要通过SearchHits API来获取查询结果。
阅读全文