SearchHits 中的 LinkedHashMap 对象而不是用户类型对象

问题描述 投票:0回答:1

为了在“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 添加到索引中。

elasticsearch spring-data-elasticsearch linkedhashmap
1个回答
0
投票

如果您告诉 Spring Data Elasticsearch 返回

Object
类型的实体,您只会得到一些对象。并且
Map<String, Object>
基本上是返回的 JSON 值可以转换为的唯一内容。

Spring Data 的概念基于实体和存储库,每个实体和存储库存储一个实体。

您想要实现的是在一次调用中读取许多不同的实体类型,并期望 Spring Data Elasticsearch 知道如何将返回的数据转换为不同的实体实例。

这不是由 Spring Data Elasticsearch 完成的,但您可以自己实现一些处理该问题的逻辑。早在 2021 年 5 月,我就写了一篇博文,展示了如何实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.