search_after 与 spring-data-elasticsearch
search_after with spring-data-elasticsearch
有人成功地将 search_after 与 spring-data-elasticsearch 一起使用了吗?
我已将 _uid 添加到我的排序中,@Controller 已将其正确放入我的 Pageable 中。我打开了慢速查询日志并验证了如果我手动 运行 @Repository 生成的查询,我会得到响应:
"sort": [
1522270372773,
"log#AWJuYn7SAKReCIGzMYda"
]
我添加到我的 pojo(@Repository 返回的 class):
@JsonProperty("sort")
String[] sort;
排序总是返回 null。尝试了几种不同的方法,但无法弄清楚如何设置排序。有什么想法吗?
我已经解决了问题,但发现了一些令人失望的细节。
在 mapResults 方法中,代码从 SearchHit.sourceAsString() 填充我的 POJO。 sourceAsString 提供原始 JSON 的子集,其中不包括排序数组,即
"sort": [
1522270147602,
"log#AWJuXxJ_AKReCIGzMYdV"
]
访问修饰符(没有 getter 和 final 的私有)没有提供优雅的增强。我最终复制了 DefaultResultMapper 并实现了一个类似于 setPersistentEntityId 的方法,该方法将 sortValues 设置到我的 pojo 中。该方法的实现如下:
private <T> void setSearchSortValues(T result, Object[] sortValues, Class<T> clazz) {
if(SortAware.class.isAssignableFrom(clazz)) {
((SortAware) result).setSortValues(sortValues);
}
}
我的 POJO 实现了我定义如下的 SortAware 接口:
public interface SortAware {
public Object[] getSortValues();
public void setSortValues(Object[] sortValues);
}
有人成功地将 search_after 与 spring-data-elasticsearch 一起使用了吗?
我已将 _uid 添加到我的排序中,@Controller 已将其正确放入我的 Pageable 中。我打开了慢速查询日志并验证了如果我手动 运行 @Repository 生成的查询,我会得到响应:
"sort": [
1522270372773,
"log#AWJuYn7SAKReCIGzMYda"
]
我添加到我的 pojo(@Repository 返回的 class):
@JsonProperty("sort")
String[] sort;
排序总是返回 null。尝试了几种不同的方法,但无法弄清楚如何设置排序。有什么想法吗?
我已经解决了问题,但发现了一些令人失望的细节。
在 mapResults 方法中,代码从 SearchHit.sourceAsString() 填充我的 POJO。 sourceAsString 提供原始 JSON 的子集,其中不包括排序数组,即
"sort": [
1522270147602,
"log#AWJuXxJ_AKReCIGzMYdV"
]
访问修饰符(没有 getter 和 final 的私有)没有提供优雅的增强。我最终复制了 DefaultResultMapper 并实现了一个类似于 setPersistentEntityId 的方法,该方法将 sortValues 设置到我的 pojo 中。该方法的实现如下:
private <T> void setSearchSortValues(T result, Object[] sortValues, Class<T> clazz) {
if(SortAware.class.isAssignableFrom(clazz)) {
((SortAware) result).setSortValues(sortValues);
}
}
我的 POJO 实现了我定义如下的 SortAware 接口:
public interface SortAware {
public Object[] getSortValues();
public void setSortValues(Object[] sortValues);
}