为了在“Spring Data ES”中使用一个查询搜索多个索引,我创建了一个对象“IndexCooperatives”,在其中添加了我需要的索引的名称。结果是预期的。同时,对文件是否符合要求的评价是根据结果的总体来确定的,而不是单独根据各个指标来确定的。 但我遇到了一个问题:查询结果的一些文档被定义为相应用户类的类型,但有些被定义为“LinkedHashMap”。 同时,对于每个索引单独进行任何其他查询,则不存在这种情况。 我的“索引坐标”看起来像这样:
最终静态索引坐标 ALIAS_INDEX_COORDINATES = IndexCoordinates.of("directors_index", "actors_index", "native_film_index","serial_index");
请求代码如下:
Query query = NativeQuery.builder()
.withQuery(q -> q.functionScore(f -> f
.functions(fu -> fu.fieldValueFactor(fvf -> fvf
.field("booster")
.modifier(FieldValueFactorModifier.Log2p)
.missing(0.0)
))
.query(fq -> fq.
bool(b -> {
if (titleInLowercase.equals("")) {
b.must(m -> m.matchAll(ma -> ma));
} else if ((titleInLowercase.length()) >= 2) {
// for "directors_index", "actors_index"
b.should(s -> s
.match(m -> m
.field("name")
.query(titleInLowercase)));
// for "native_film_index","serial_index"
b.should(s -> s
.match(m -> m
.field("title")
.query(titleInLowercase)));
}
if (!frontRequest.isNull("language") && finalValueListLanguage.size() == 1) { b.filter(bf -> bf... }
if (!frontRequest.isNull("countries") && finalValueListCountries.size() == 1) { b.filter(bf -> bf... }
.....
return b;
}))))
.withPageable(Pageable.ofSize(pageSize))
.build();
SearchHits<Object> filmSearchHits = operations.search(query, Object.class, indexCoordinates);
List<Object> searchResult = filmSearchHits.stream().map(SearchHit::getContent).toList();
接下来,必须根据接收到的文档的类别(需要特定的用户类型)将每个文档转换为相应的 DTO。但在某些情况下,会发出“LinkedHashMap”,而不是我期望的,并且不可能形成“DTO”,因为该方法从相应用户类型的文档生成“DTO”对象。如何将对象从“LinkedHashMap”转换为所需的类是另一个主题的不必要问题。 请帮助我了解“LinkedHashMap”是如何发生的,以及如何避免它(如果可能)。 最初,对象作为 JSONObject 添加到索引中。
如果您告诉 Spring Data Elasticsearch 返回
Object
类型的实体,您只会得到一些对象。并且 Map<String, Object>
基本上是返回的 JSON 值可以转换为的唯一内容。
Spring Data 的概念基于实体和存储库,每个实体和存储库存储一个实体。
您想要实现的是在一次调用中读取许多不同的实体类型,并期望 Spring Data Elasticsearch 知道如何将返回的数据转换为不同的实体实例。
这不是由 Spring Data Elasticsearch 完成的,但您可以自己实现一些处理该问题的逻辑。早在 2021 年 5 月,我就写了一篇博文,展示了如何实现这一点。