首页 > 解决方案 > 在spring data elasticsearch中,如何在所有结果上投影或添加计算字段?

问题描述

我正在使用 spring-data-elasticsearch (最新版本)以及 elasticsearch 的 docker 实例(最新版本),并且我想计算查询后从我的存储库返回的所有结果的字段。我不希望存储库中的这些信息,因为它有时依赖于查询,有时依赖于环境。例如,如果我们执行查询,我想生成一个 URL,其中包含查询术语作为我想要丰富结果的 URL 中的查询参数。还有一些其他的情况。我尝试创建一个接受整个文档对象的弹簧数据自定义读取转换器。我可以看到它在应用程序启动时被识别,但从未被调用。如何使用自定义值投影字段,或使用上下文计算的值丰富返回的文档?

标签: elasticsearchspring-data-elasticsearch

解决方案


我首先想到AfterConvertCallback的就像 Chin 评论的那样,但是在回调中,您没有为获取实体而运行的查询的上下文,因此您不能使用诸如查询术语之类的东西来构建某些东西。

我会将属性(我们在这里命名它url的类型String)添加到实体并用注释标记它org.springframework.data.annotation.Transient以防止它被存储。

然后在您进行搜索的方法中,使用ElasticsearchOperations或存储库,对返回的实体进行后处理(代码未经测试,仅在此处写下):

SearchHits<Entity> searchHits = repository.findByFoo(String fooValue);
searchHits.getSearchHits().forEach(searchHit -> {
    searchHit.getContent().setUrl(someValueDerivedFromEnvironemtAndQuery);
});

之后继续使用SearchHits.


推荐阅读