[英]Java elasticsearch spring-data set different index field name
[英]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.