spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决

这篇具有很好参考价值的文章主要介绍了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.Keywordfielddata = 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
spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决
如果没有请检查,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类型,直接使用原字段就可以
spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决

原因

查询ElasticSearch文档对keyword的介绍,大致说一下我的理解,有问题望指正
Keyword是相当于对Text的一个补充,设置Keyword类型或当Text设置分词器、索引的时候,就会创建一个.keyword字段,用于更快速的查询,所以文本字段需要使用索引时,不可以直接使用原字段,要利用.keyword字段操作就可以了文章来源地址https://www.toymoban.com/news/detail-423566.html

到了这里,关于spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Elasticsearch】Elasticsearch中使用_id排序导致 data too large 问题

    Elasticsearch 一个弹性伸缩的搜索数据库,后文简称 :ES ,最近有一个ES 服务查询数据时候出现了数据 Hits 结果多次查询不一致的问题,而且这块代码已经很长时间没有修改,一直稳定运行了很长时间,用户翻译查询列表数据的时候又是出现1条,有时候出现2条或者3条。(再加上

    2024年02月03日
    浏览(36)
  • ElasticSearch 实战:查询Sort(查询排序)

    在Elasticsearch中,查询排序(Sort)功能允许用户控制搜索结果的返回顺序。这有助于根据特定字段的值对匹配文档进行升序(asc)或降序(desc)排列。以下是如何在实战中使用Elasticsearch查询排序的示例: 一、基本排序 **1. 在URL参数中指定排序 : 此请求将按照 title 字段的值

    2024年04月16日
    浏览(30)
  • Spring Boot中使用Spring Data Elasticsearch访问Elasticsearch

    Elasticsearch是一个分布式的全文搜索和分析引擎,它可以将海量数据进行快速的查询和聚合。Spring Data Elasticsearch是Spring Data家族中的一个成员,它提供了与Elasticsearch的集成,可以方便地使用Spring框架来访问Elasticsearch。 在本文中,我们将会介绍如何在Spring Boot中使用Spring Data

    2024年02月08日
    浏览(48)
  • Spring Data Elasticsearch--使用/教程/实例

    原文网址:Spring Data Elasticsearch--使用/教程/实例_IT利刃出鞘的博客-CSDN博客 技术星球 欢迎来到IT技术星球,网站是:learn.skyofit.com(或者百度直接搜:自学精灵)。内容有: Java真实面试题 、 Java设计模式实战 、Shiro项目实战、 Idea和Navicat的“魔法” 教程、 SpringBoot进阶 、架构

    2023年04月09日
    浏览(46)
  • Spring Data Elasticsearch 的简单使用

    目录 一、简介 二、配置 三、映射 四、 常用方法 五、操作(重点) 1、对索引表的操作 2、对文档的操作(重点) (1)、添加文档  (2)、删除文档 (3)、查询文档(重点) 查询全部文档 (两种方式) matchQuery根据拆分进行全局搜索 matchPhraseQuery短语搜索--完整搜

    2024年02月12日
    浏览(43)
  • Spring Data Elasticsearch配置及使用

    以POJO为中心模型用于与Elastichsearch文档交互,并轻松编写存储库样式的数据访问层框架 我们学习的是底层封装了Rest High Level的ElasticsearchRestTemplate模板类型。需要使用Java API Client(Transport),则应用ElasticsearchTemplate模板类型即可。两种类型中的方法API几乎完全一样,学会了一

    2024年02月11日
    浏览(46)
  • ElasticSearch系列 - SpringBoot整合ES:实现搜索结果排序 sort

    00. 数据准备 01. Elasticsearch 默认的排序方式是什么? ElasticSearch 默认的排序方式是相关性排序。相关性排序是根据查询条件与文档的匹配程度来计算每个文档的相关性得分,然后按照得分从高到低进行排序。相关性排序是 ElasticSearch 中最常用的排序方式,因为它可以根据查询

    2024年02月02日
    浏览(54)
  • 解决使用@Field注解配置分词器失效问题(Spring Data Elasticsearch)

    问题复现:插入数据时,实体类配置的@Field注解没有生效 实体类: 查看索引库,发现它使用动态映射,并没有使用静态映射: 解决方案:在插入数据时,提前创建索引库和映射。

    2024年02月16日
    浏览(34)
  • 【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

    更多有关博主写的往期Elasticsearch文章 标题 地址 【ElasticSearch 集群】Linux安装ElasticSearch集群(图文解说详细版) https://masiyi.blog.csdn.net/article/details/131109454 基于SpringBoot+ElasticSearch 的Java底层框架的实现 https://masiyi.blog.csdn.net/article/details/121534307 ElasticSearch对标Mysql,谁能拔得头筹

    2024年02月11日
    浏览(38)
  • spring data elasticsearch使用7.x客户端兼容es 8.x和使用ssl构建RestHighLevelClient

    es在7.x中默认加入elastic security组件所以java client需要使用ssl连接es server. es 8.x 中废弃了 RestHighLevelClient ,使用新版的 java api client ,但是spring data elasticsearch还未更新到该版本.所以需要兼容es 8.x 如下是RestHighLevelClient构建方法: spring data elasticsearch客户端依赖(基于spring boot2.7使用最新

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包