IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> ES JPA 带排序查询报错,java.lang.IllegalArgumentException: numHits must be > 0 -> 正文阅读

[大数据]ES JPA 带排序查询报错,java.lang.IllegalArgumentException: numHits must be > 0

简介

当你的 ES 版本 >= 7.6, 单个索引的文档数 > 512, 查询时使用JPA 查询,或者手动优化 size = 0, 均会出现该问题。

例如:

public interface A extends ElasticsearchRepository<FinanceReportDay, String> {
    List<FinanceReportDay> findByStockCodeOrderByPublishTimeAsc(String stockCode);
}

则会出现以下报错信息:

java.lang.IllegalArgumentException: numHits must be > 0; please use TotalHitCountCollector if you just need the total hit count.

问题详情

经过调试发现,JPA 会对查询语句进行优化,会先进行 count 查询,然后再进行实际查询,并且优化后的查询语句如下所示:

POST stock_finance_report_day/_search
{
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "1111",
            "fields": [
              "stock_code^1.0"
            ],
            "type": "best_fields",
            "default_operator": "and",
            "max_determinized_states": 10000,
            "enable_position_increments": true,
            "fuzziness": "AUTO",
            "fuzzy_prefix_length": 0,
            "fuzzy_max_expansions": 50,
            "phrase_slop": 0,
            "escape": false,
            "auto_generate_synonyms_phrase_query": true,
            "fuzzy_transpositions": true,
            "boost": 1
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "version": true,
  "sort": [
    {
      "publish_time": {
        "order": "asc"
      }
    }
  ],
  "track_total_hits": 2147483647
}

问题原因

Google 后,发现该问题,是ES 的 BUG,相关 issue: Search can fail when size is 0 and long sort optimization enabled.

问题的原因就在于 ES 7.6 版本后对于文档数 > 512 的排序查询进行了优化,导致了如果查询时同时使用了size = 0, track_total_hits就会出现该问题。

解决方案

方案一

升级版本升级 ES版本至 8.0(不确定是否已经修复,详情参数对应 issue

方案二

使用非 JPA 使用 RestHighClient 进行手动查询

方案三

手动查询出所有数据(如果数据量不大于单次最大请求数量,默认10000条),然后手动进行排序

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:18:09  更:2022-04-04 12:21:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:36:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码