spring-boot - 春季启动弹性搜索“search_after”
问题描述
如何在 spring boot中将“search_after”( https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-request-search-after.htmlNativeSearchQueryBuilder
)添加到我的 elasticsearch 查询中?
解决方案
是的,您可以结合NativeSearchQueryBuilder
自定义查询来获得所需的结果。
NativeSearchQueryBuilder
不提供在之后添加搜索的方法。
但是您可以使用使用本机构建器构建的查询来使用 search after 参数发出字符串查询请求。
这是一个例子。
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.EntityMapper;
...
var queryBuilder = new NativeSearchQueryBuilder().withQuery(BoolQueryBuilder.boolQuery());
var jsonQuery = new JSONObject();
jsonQuery.put("size", SEARCH_AFTER_PAGE_SIZE);
jsonQuery.put("query", new JSONObject(queryBuilder.build().getQuery().toString()));
var sortList = new JSONObject();
for (Sort.Order order : sort) {
sortList.put(order.getProperty(), order.getDirection());
}
jsonQuery.put("sort", sortList);
String businessSortMarker = "previous order value 1";
String tiebreakerSortMarker = "previous order value 2";
if (searchAfterParameters != null) {
jsonQuery.put("search_after", Arrays.asList(businessSortMarker, tiebreakerSortMarker));
}
var query = new Search.Builder(searchAfterQuery.toString()).build();
SearchResult result = client.execute(query);
var resultPage = new SearchResultsPage<ResultObject>();
EsEntityMapper documentsMapper = new EsEntityMapper();
searchResult.getHits(JsonObject.class).stream()
.map(hitJson -> hitJson.source)
.map(source -> documentsMapper.mapToObject(searchResultJson.toString(), SearchResult.class))
.collect(Collectors.toList());
//map the documents itself (content)
var resultObject = mapHitsSourceToResultObjects(searchResult);
resultPage.setContent(resultObject);
您可以在此处查看更多详细信息: https ://www.shardik.com/blog/2021/03/09/es-deep-search/
推荐阅读
- android - 当设备停靠在底座中时,Android 上的 Chrome 会重新启动
- javascript - JS - 比较两个数组中的两个值似乎不起作用
- php - 如何使用 ob_get_contents() 获取 int 的值;
- firebase - 我应该如何在 vuejs 中设置 Firebase 云消息传递?
- rethinkdb - 嵌套对象更新不会触发 changedFeed 事件
- sqlite - 输出树的打开和关闭元素
- python - 解码字符串以识别法语字符
- php - 在 Laravel 中使用 Eloquent 更新一对多关系
- ios - 覆盖 UINavigationController 中的向后滑动手势
- r - 如何在 R 中进行最大协方差分析?