elasticsearch - 在spring data elasticsearch中,如何在所有结果上投影或添加计算字段?
问题描述
我正在使用 spring-data-elasticsearch (最新版本)以及 elasticsearch 的 docker 实例(最新版本),并且我想计算查询后从我的存储库返回的所有结果的字段。我不希望存储库中的这些信息,因为它有时依赖于查询,有时依赖于环境。例如,如果我们执行查询,我想生成一个 URL,其中包含查询术语作为我想要丰富结果的 URL 中的查询参数。还有一些其他的情况。我尝试创建一个接受整个文档对象的弹簧数据自定义读取转换器。我可以看到它在应用程序启动时被识别,但从未被调用。如何使用自定义值投影字段,或使用上下文计算的值丰富返回的文档?
解决方案
我首先想到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
.
推荐阅读
- reactjs - 在反应中使用用户阻止系统
- docker - 连接 nginx 和 php 容器的 Docker 链接
- excel - 使用索引和匹配返回错误:“公式或函数无法使用值”
- laravel - Laravel 覆盖包中的父视图
- android - 尝试访问 PlacesClient.findCurrentPlace() 时出现 com.android.volley.TimeoutError
- python - 使用线程python将参数从一个类传递到另一个类
- swift - 在 Swift 函数中,当函数在循环内包含带有 if 语句的 for 循环时,为什么“return”必须在 for 循环之外?
- javascript - 如何使用复制到剪贴板
- r - 函数正在为无效参数执行
- keras - 为什么 YOLO v3 Keras 越野车?