簡體   English   中英

如何使用 spring-data elasticsearch 對新添加的字段進行排序?

[英]How to sort on newly added field with spring-data elasticsearch?

我對 elasticsearch 和 spring-data 組合還很陌生。

讓我給你一些背景知識。 我從這個實體開始

@Document(indexName = "my-entity")
public class MyEntity {
    @Id
    private String id;
    private String someField;
}

其中一些已創建並編入索引。 后來,我向實體添加了一個新字段。 現在它看起來像這樣:

@Document(indexName = "my-entity")
public class MyEntity {
    @Id
    private String id;
    private String someField;
    @Field(type = FieldType.Date, format = DateFormat.date_time)
    private Date date;
}

我想要實現的是返回按我的新字段排序的所有實體(並非所有現有實體都有)。

最初我調整了我的Repository並定義了類似於List<MyEntity> findAllByOrderByDate(); ,但是當我嘗試調用它時,出現以下異常:

"No mapping found for [date] in order to sort on"

我知道一個可能的解決方案是使用 elasticsearch 中的ignore_unmapped選項,但我的問題是:如何使用 spring-data-elasticsearch 實現這一點?

另一方面,我並沒有固定使用Repository方法——我對解決方案持開放態度。

謝謝!

當你添加一個新的字段進行排序時,Elasticsearch 中的索引映射需要更新,否則 Elasticsearch 這個字段是什么類型。 Spring 數據 Elasticsearch 存儲庫不自動更新映射。

以下是檢查 class(在此示例中名為Foo )的映射是否需要更新的方法:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.stereotype.Component;

/**
 * @author P.J. Meisch (pj.meisch@sothawo.com)
 */
@Component
public class FooMappingValidator {

    private static final Logger LOGGER = LoggerFactory.getLogger(FooMappingValidator.class);

    private final ObjectMapper objectMapper = new ObjectMapper();
    private final ElasticsearchOperations operations;

    public FooMappingValidator(ElasticsearchOperations operations) {
        this.operations = operations;
    }

    @Autowired
    public void checkFooMapping() {

        var indexOperations = operations.indexOps(Foo.class);

        if (indexOperations.exists()) {
            LOGGER.info("checking if mapping for Foo changed");

            var mappingFromEntity = indexOperations.createMapping();
            var mappingFromEntityNode = objectMapper.valueToTree(mappingFromEntity);
            var mappingFromIndexNode = objectMapper.valueToTree(indexOperations.getMapping());

            if (!mappingFromEntityNode.equals(mappingFromIndexNode)) {
                LOGGER.info("mapping for class Foo changed!");
                indexOperations.putMapping(mappingFromEntity);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM