问题描述
这是我的实体:
public class RecentTransactionBo {
@JsonProperty("timestamp")
@Field(type = FieldType.Date,format = DateFormat.basic_date_time)
@Id
@Temporal(TemporalType.DATE)
private Date creationDate;
private List<String> transactionId;
}
我正在对其进行排序操作:
Iterable<RecentTransactionBo> recentTransactionBoIterable = recentTransactionDao.findAll(Sort.by(Sort.Direction.DESC,"creationDate"));
我遇到以下错误:
2020-09-08 02:42:29.116 ERROR 7116 --- [nio-8090-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing Failed; nested exception is org.springframework.data.elasticsearch.UncategorizedElasticsearchException: Elasticsearch exception [type=search_phase_execution_exception,reason=all shards Failed]; nested exception is ElasticsearchStatusException[Elasticsearch exception [type=search_phase_execution_exception,reason=all shards Failed]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception,reason=Text fields are not optimised for operations that require per-document field data like aggregations and sorting,so these operations are disabled by default. Please use a keyword field instead. Alternatively,set fielddata=true on [creationDate] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception,set fielddata=true on [creationDate] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]];] with root cause
org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=illegal_argument_exception,set fielddata=true on [creationDate] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]
我的DAO看起来像这样。
@Repository
public interface RecentTransactionDao extends ElasticsearchRepository<RecentTransactionBo,Date> {
}
解决方法
要正确解决此问题,您应该创建正确的映射并将必填字段设置为 keyword
类型。
其他解决方案是运行命令:
PUT <your_index_name>/_mapping
{
"properties": {
"creationDate": {
"type": "text","fielddata": true
},"host.name": {
"type": "text","fielddata": true
}
}
}
上面我在 2 个字段上设置 fielddata
属性 - creationDate
和 host.name
作为示例,如何在一次调用中在多个字段上设置它。 Elastic 一次只会给你一个名字,所以你可能需要多次运行命令,除非你事先知道所有有问题的字段。