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。尝试了几种不同的方法,但无法弄清楚如何设置排序。有什么想法吗?

我已经解决了问题,但发现了一些令人失望的细节。

罪魁祸首在这里:https://github.com/spring-projects/spring-data-elasticsearch/blob/3.0.x/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java

在 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);

}