spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决
异常信息
核心提示在Please use a keyword field instead. Alternatively, set fielddata=true on [dataTimestamp] in order to load field data by uninverting the inverted index.
待排序字段dataTimestamp
没有为排序优化,所以无法排序,需要配置FieldType.Keyword
或fielddata = true
,可是代码中都配置了为什么还提示呢,往下看……
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 [dataTimestamp] 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, 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 [dataTimestamp] in order to load field data by uninverting the inverted index. Note that this can use significant memory.]]
环境
spring-data-elasticsearch 4.1.3
ElasticSearch 7.9.3
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>4.1.3</version>
</dependency>
spring-data-elasticsearch这块,对ElasticSearch 7.16之前的都差不多,相似版本可以尝试
代码配置
ElasticSearch实体
如下配置,异常提示需要将排序字段设置为Keyword类型(推荐),或者将fielddata设置为true(不推荐),可是我都设置了,还是提示上面的
注意:这里使用Spring ElasticSearch注解是否生效一定要注意,如果注解未生效就会导致声明的索引、字段信息都是无效的,所以配置了也没有,下面说如何检查
@Data
@Document(indexName = "test-index")
public class ElasticSearchEntity {/*** ElasticSearch Long型精度会丢失*/@Id@Field(type = FieldType.Keyword)private String dataId;// 配置二选一即可,推荐FieldType.Keyword,使用fielddata = true相对更占资源@Field(type = FieldType.Keyword, fielddata = true)private String dataTimestamp;}
检查ElasticSearch实体映射结果
项目启动后会自动在ElasticSearch创建索引,查询索引信息,有mapping才说明注解配置生效了,因为注解声明的字段信息在ElasticSearch对应的就是mapping
如果没有请检查,Java日志是否有如下类似的创建失败警告
,按照警告提示修改实体注解配置,尝试至无警告创建,再到ElasticSearch查询索引是否正确加载mapping
[o.s.d.e.r.s.SimpleElasticsearchRepository,<init> : 96] - Cannot create index: Elasticsearch exception [type=mapper_parsing_exception, reason=Mapping definition for
ElasticSearch数据操作接口
public interface IndexRepository extends ElasticsearchRepository<ElasticSearchEntity, String> {}
查询调用(高级查询接口自定义)
这里先列出来两种写法,因为mapping字段声明未加载成功可导致使用时的问题,推荐第一种,所以上面如果有问题的检查一下
Criteria criteria = new Criteria("title").contains(keyword);// 1、没有加载mapping默认识别string类型,如果keyword声明加载成功这么写就可以了(推荐这种,所以上面如果有问题的检查一下)
Sort sort = Sort.by("_score", "dataTimestamp").descending();// 2、没有加载mapping默认为string类型创建keyword,Keyword类型才有索引可以排序,想使用Keyword索引要加.keyword使用,否则还是原字段
Sort sort = Sort.by("_score", "dataTimestamp.keyword").descending();Query query = new CriteriaQuery(criteria).setPageable(PageRequest.of(pageNum, pageSize, sort));SearchHits<ElasticSearchEntity> searchHits = elasticsearchRestTemplate.search(query, ElasticSearchEntity.class, IndexCoordinates.of("index-*"));
发现问题
各种查文档,都没有对spring-data-elasticsearch的这个异常处理方案,所以只能自己查了
既然是ElasticSearch的错误就去原生查询,查询时发现,ElasticSearch的dataTimestamp的字段有两个,因为没有加载mapping默认识别string类型,默认还会为string类型创建keyword,所以这时候有两种类型,使用的时候就要注意调用区分,如果keyword声明成功,就只有一个keyword类型,直接使用原字段就可以
原因
查询ElasticSearch文档对keyword的介绍,大致说一下我的理解,有问题望指正
Keyword是相当于对Text的一个补充,设置Keyword类型或当Text设置分词器、索引的时候,就会创建一个.keyword字段,用于更快速的查询,所以文本字段需要使用索引时,不可以直接使用原字段,要利用.keyword字段操作就可以了
spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决相关推荐
- Lucene 和 Kibana、ElasticSeach、Spring Data ElasticSearch
什么是全文检索 数据分类 生活中的数据总体分为两种:结构化数据和非结构化数据. 结构化数据 - 行数据,可以用二维表结构来逻辑表达实现的数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结 ...
- SpringBoot整合Spring Data Elasticsearch
特点: 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心) Restful风格,一切API都遵循Rest原则,容易上手 近实时搜索,数据更新在Elasticsear ...
- 【javaWeb微服务架构项目——乐优商城day07】——Elasticsearch介绍和安装及使用(安装kibana,安装ik分词器,Spring Data Elasticsearch,高级查询)
文章目录 0.学习目标 1.Elasticsearch介绍和安装 1.1.简介 1.1.1.Elastic 1.1.2.Elasticsearch 1.1.3.版本 1.2.安装和配置 1.2.1.新 ...
- Spring Data ElasticSearch入门案例
Spring Data ElasticSearch入门案例 创建maven工程elasticsearch_springdata 基于maven导入坐标 导入spring data elasticsea ...
- orderby排序慢_使用@OrderBy对Spring Data MongoDB集合进行排序
orderby排序慢 这是关于调整和增强Spring Data MongoDB功能的第三篇文章. 这次,我发现我错过了一个JPA功能– @OrderBy批注. @OrderBy指定在检索关联值时集合值 ...
- 使用@OrderBy对Spring Data MongoDB集合进行排序
这是关于调整和增强Spring Data MongoDB功能的第三篇文章. 这次,我发现我错过了一个JPA功能– @OrderBy批注. @OrderBy指定在检索关联值时集合值关联的元素的顺序. 在 ...
- SpringBoot207 - 集成 spring data elasticsearch
扯淡: Spring Data Elasticsearch 是spring data对elasticsearch进行的封装.所以在springboot项目中使用es非常方便,直接在 dao 接口继承 ...
- Spring Data Elasticsearch聚合搜索实战
准备环境 1 安装Elasticsearch 5.5.2 (略) 2 使用爬虫爬取厦门人才网相关招聘信息(略) 通过elasticsearch-head插件可以看到我们已经爬取很多数据了 3 在项目中 ...
- 通过Spring Data Elasticsearch操作ES
Elasticsearch Elasticsearch (ES)是一个基于Lucene构建的开源.分布式.RESTful 接口全文搜索引擎.Elasticsearch 还是一个分布式文档数据库,其中每 ...
最新文章
- 2022-2028年中国聚碳酸亚丙酯(PPC)行业市场深度分析及未来趋势预测报告
- 你还在从零搭建项目 ?
- JAVA的两个FTP包的比较
- 一份简单的在 Linux下编译及调试 C 代码的指南
- Windows环境下yolov3+darknet批量处理图片完整教程
- 软件工程——理论、方法与实践 第一章
- ffmpeg 为取经而来_伊力特的英雄情结从何而来?
- jpa级联添加_JPA中的一对多双向关联与级联操作
- pelco协议及其实现的简单认识
- HDU5687 Problem C【字典树】
- 小麦积分墙:我的App与微信搞上了
- display:inline-block 间隙
- CF547D Mike and Fish 建图
- CorelDRAWX4的VBA插件开发(二十)创建进度条来显示程序运行进度
- Uva 816 Abbott's Revenge 紫书165页例题
- 计算机科学美国大学专业,2015年U.S.NEWS计算机科学专业美国大学排名
- 内连接(inner join)与外连接(outer join)小结
- php编程语言教程,php语言教程
- 【论文复现】CBAM(2018)
- 微端是什么意思?微端对服务器性能配置要求
热门文章
- Linux下的Cannot find a valid baseurl for repo: base/7/x86_64问题记载
- angular.js-服务-http-路由(5)
- Shopify开店建站营销推广卖家平台后台中文指南 – Abandoned checkout recovery/挽救弃单
- Dojo JQuery
- 九年义务教育的精英,遇上十年寒窗苦读的翘楚,必将擦出耀眼的火花!
- 转:车规芯片的AEC-Q100测试标准
- Python网络爬虫入门案例
- 慕课java工程师2020版_2020智慧树慕课Java 程序设计答案最新最全课后作业答案
- Java电子信箱系统的设计与实现
- 魔兽地图编辑器插件YDWE的使用与基本设置6 输入管理器