search_after with spring-data-elasticsearch

时间:2018-06-11 21:24:20

标签: spring-data-elasticsearch

有没有人成功地将search_after用于spring-data-elasticsearch?

我已经将_uid添加到我的排序中,这正确地被@Controller放入我的Pageable中。我打开慢速查询日志并验证我是否手动运行@Repository生成的查询,我得到了响应:

    "sort": [
      1522270372773,
      "log#AWJuYn7SAKReCIGzMYda"
    ]

我添加到我的pojo(@Repository返回的类)中:

 @JsonProperty("sort")
 String[] sort;

Sort总是以null返回。尝试了几个不同的东西,无法弄清楚如何设置排序。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

罪魁祸首在于: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和finals的私有)没有提供优雅的增强功能。我最终复制了DefaultResultMapper并实现了一个类似于setPersistentEntityId的方法,它将sortValues设置为我的pojo。该方法的impl如下:

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

}