【问题标题】:search_after with spring-data-elasticsearchsearch_after 与 spring-data-elasticsearch
【发布时间】:2018-06-11 21:24:19
【问题描述】:

有没有人成功将 search_after 与 spring-data-elasticsearch 一起使用?

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

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

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

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

排序总是返回为空。尝试了几种不同的方法,但无法弄清楚如何设置排序。有什么想法吗?

【问题讨论】:

  • 我想到的一件事是数组中的第一项不是字符串。有趣的是,当 elasticsearch 本身不允许时,elasticsearch 人制作了一个混合类型的数组。

标签: spring-data-elasticsearch


【解决方案1】:

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

罪魁祸首在这里: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);

}

【讨论】:

    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 2016-09-13
    • 2021-07-08
    • 1970-01-01
    • 2018-02-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多