我需要计算SUM的所有字段都是INT但是当我发出请求时我得到了这个错误:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Expected numeric type on field [mlf16_txservnum], but got [string]"
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "bpa_stag_v3",
"node": "zzsbvdwmQ0-d0Ca_b3w0uQ",
"reason": {
"type": "illegal_argument_exception",
"reason": "Expected numeric type on field [mlf16_txservnum], but got [string]"
}
}
]
},
"status": 400
}
请求:
{
"size" : 0,
"query" : {
"bool" : {
"filter" : [ {
"term" : {
"mlf16_cptfou_six" : "095436"
}
}, {
"term" : {
"mlf16_codadres" : "00"
}
}, {
"term" : {
"mlf16_semind" : "24"
}
}, {
"term" : {
"mlf16_annee" : "2017"
}
} ]
}
},
"aggregations" : {
"Sum_Service_Rate_Numerator" : {
"sum" : {
"field" : "mlf16_txservnum"
}
},
"Sum_Service_Rate_Denominator" : {
"sum" : {
"field" : "mlf16_txservden"
}
}
}
}
此处没有任何聚合的索引:
{
"_index": "bpa_stag_v3",
"_type": "indic_semaine_yassine",
"_id": "2017-06-11,2017,23,23,0000900156,05,0000241235,00,00,5I,3,0,19,0,2,0,0,3,2,2,0,12,3,241235,2017",
"_score": 1,
"_source": {
"dt_extract": "2017-06-11",
"mlf16_annee": "2017",
"mlf16_semind": "23",
"mlf16_semcal": "23",
"mlf16_cptmag": "0000900156",
"mlf16_codraft": "05",
"mlf16_cptfou": "0000241235",
"mlf16_codadrdl": "00",
"mlf16_codadres": "00",
"mlf16_grpges": "5I",
"mlf16_clasges": "3",
"mlf16_txservnum": 0,
"mlf16_txservden": 19,
"mlf16_txdocnum": 0,
"mlf16_txdocden": 2,
"mlf16_txfiabnum": 0,
"mlf16_txfiabden": 0,
"mlf16_refret2j": 3,
"mlf16_refret7j": 2,
"mlf16_refret21j": 2,
"mlf16_natcouv": "0",
"mlf16_nbligndiff": 12,
"mlf16_nbrefdiff": 3,
"mlf16_cptfou_six": "241235",
"dt_year": 2017,
"es_id": "2017-06-11,2017,23,23,0000900156,05,0000241235,00,00,5I,3,0,19,0,2,0,0,3,2,2,0,12,3,241235,2017"
}
},
这里是我的索引的映射:
{
"bpa_stag_v3": {
"mappings": {
"indic_semaine_yassine": {
"dynamic_templates": [
{
"string_fields": {
"mapping": {
"index": "not_analyzed",
"omit_norms": true,
"type": "string"
},
"match": "*",
"match_mapping_type": "string"
}
}
],
"properties": {
"dt_extract": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"dt_year": {
"type": "long"
},
"es_id": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_annee": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_clasges": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_codadrdl": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_codadres": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_codraft": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_cptfou": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_cptfou_six": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_cptmag": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_grpges": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_natcouv": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_nbligndiff": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_nbrefdiff": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"mlf16_refret21j": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_refret2j": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_refret7j": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_semcal": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_semind": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_txdocden": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_txdocnum": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_txfiabden": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_txfiabnum": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_txservden": {
"type": "string",
"index": "not_analyzed"
},
"mlf16_txservnum": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
答案 0 :(得分:5)
正如您的例外所说,"reason": "Expected numeric type on field [mlf16_txservnum], but got [string]"
,它清楚地表明mlf16_txservnum
是字符串但数字是预期的,因为聚合sum
只能应用于数字,而不是字符串,并且在您的映射中,已将mlf16_txservnum
的数据类型指定为字符串。
"mlf16_txservnum": {
"type": "string",
"index": "not_analyzed"
}
将地图中的类型更改为此字段的数字(整数,双数等)以及执行求和的其他字段:
"mlf16_txservnum": {
"type": "integer"
}
答案 1 :(得分:1)
我认为@RA KA解释了这个问题并解决了问题。但还有另一种解决方法。如果您的数据很大并且无法重新索引,则可以在运行时更改值的数据类型。
"aggregations" : {
"Sum_Service_Rate_Numerator" : {
"sum" : {
"field" : 'Integer.parseInt(doc["mlf16_txservnum"].value)'
}
},
"Sum_Service_Rate_Denominator" : {
"sum" : {
"field" : 'Integer.parseInt(doc["mlf16_txservden"].value)'
}
}
}
希望这有助于......!