Elasticsearch搜索出现NAN异常

原因分析

  • Elasticsearch默认的打分,一般是不会出现异常的
  • 之所以会出现NAN异常,往往是因为我们重新计算了打分,使用了function_score
  • 核心原因是在function_score中,出现了计算异常,比如 0/0,比如log1p(x),x为负数等

真实案例分析

测试索引

bash 复制代码
PUT tx
POST tx/_mapping
{
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "time" : {
          "type" : "date",
          "format" : "yyyy-MM-dd"
        },
        "title" : {
          "type" : "text",
          "analyzer" : "ik_smart"
        }
      }
}
POST tx/_doc/19
{
  "title":"中古",
   "time" : "1969-10-12",
   "age":12
}

搜索query示例

bash 复制代码
POST /tx/_search
{
  "query": {
    "function_score": {
      "query": {
          "match_all": {}
      },
      "field_value_factor": {
        "field": "time",
        "modifier": "log1p"
      }
    }
  }
}
- 其实modifier.log1p和如下搜索是完全一样的
POST /tx/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "script_score": {
        "script": "_score * Math.log1p(1+doc['time'].value.toInstant().toEpochMilli())"
      }
    }
  }
}

搜索异常返回值

bash 复制代码
{
  "error" : {
    "root_cause" : [
      {
        "type" : "exception",
        "reason" : "function score query returned an invalid score: NaN for doc: 0"
      }
    ],
    "type" : "search_phase_execution_exception",
    "reason" : "all shards failed",
    "phase" : "query",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : 0,
        "index" : "tx",
        "node" : "aPOBCVYkRA-a0R9FR4eDzQ",
        "reason" : {
          "type" : "exception",
          "reason" : "function score query returned an invalid score: NaN for doc: 0"
        }
      }
    ]
  },
  "status" : 500
}

搜索异常原因分析

  • 搜索使用了function_score重新打分,并且使用了log1p函数
  • 但是由于数据中的时间是"1969-10-12",但是es计算时间是从1970年计算开始,这个值换算成毫秒就是负数,导致log1p异常
  • 所以最终得分异常,出现是NAN
相关推荐
yunwei37几秒前
eBPF 入门实践教程十七:编写 eBPF 程序统计随机/顺序磁盘 I/O
linux·后端·性能优化
dingdingfish16 分钟前
TLPI 第41章 读书笔记:Fundamentals of Shared Libraries
linux·static·link·dynamic·library·tlpi
Apipi*42 分钟前
30天速通Linux 第五章Linux 进程管理
linux·运维·服务器
杨云龙UP1 小时前
PostgreSQL 四种常见部署模式快速理解:单实例、流复制、repmgr、Patroni
linux·运维·数据库·postgresql·流复制·高可用ha
流浪0011 小时前
Linux系统篇46——线程(十一) 生产者消费者模型,三种关系和一个交易场所
linux·线程·并发·同步·互斥·阻塞队列·生产者消费者模型
ofoxcoding1 小时前
借助 CLAUDE.md 约束 Sonnet 5.5 多文件重构行为的提示词实践
大数据·elasticsearch·ai·重构
Elasticsearch1 小时前
隆重推出 AlertZero:让你的告警队列实现 “收件箱清零” 式管理
elasticsearch
Jason_zhao_MR1 小时前
新一代电能数据采集终端方案
linux·人工智能·嵌入式硬件·fpga开发·嵌入式
qetfw2 小时前
Debian SSH 安全配置:端口、来源限制与免密登录
linux·安全·debian·ssh
东鹏特饮2 小时前
15个实用Linux运维脚本
linux·运维·shell·脚本·redhat·常用生产脚本