原因分析
- Elasticsearch默认的打分,一般是不会出现异常的
- 之所以会出现NAN异常,往往是因为我们重新计算了打分,使用了function_score
- 核心原因是在function_score中,出现了计算异常,比如 0/0,比如log1p(x),x为负数等
真实案例分析
测试索引
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示例
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())"
}
}
}
}
搜索异常返回值
{
"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
文章来源地址https://www.toymoban.com/news/detail-633820.html
文章来源:https://www.toymoban.com/news/detail-633820.html
到了这里,关于Elasticsearch搜索出现NAN异常的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!