一次神奇的es查询报错经历
程序员文章站
2022-06-01 20:41:38
...
今天写es数据查询,由于方法比较长,就把参数和具体查询语句分开成两个方法,参数通过map进行传递(这样可以实现动态参数),有一个条件是:
if (paramsMap.containsKey("eventsIdList")) {
bq.must(QueryBuilders.termsQuery("eventsId", paramsMap.get("eventsIdList")));
}
运行后发现报错了:
org.elasticsearch.ElasticsearchStatusException:
Elasticsearch exception [type=parsing_exception, reason=[terms] unknown token [END_ARRAY] after [eventsId]]
经过debug发现,这种情况下,直接获取map中的Object作为termsQuery的参数,会导致参数变成了数组的数组(即条件变成了eventsId IN array(array)),也就是eventsId这个Integer类型的数据,被要求等于array了。可以看到查询条件实际上是这样的:
{
"bool" : {
"must" : [
{
"terms" : {
"eventsId" : [
[
1, 2, 3, 4
]
],
"boost" : 1.0
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
解决办法是加上强制转换:
if (paramsMap.containsKey("eventsIdList")) {
bq.must(QueryBuilders.termsQuery("eventsId", (List<Integer>) paramsMap.get("eventsIdList")));
}
这样子,查询条件就变成:
{
"bool" : {
"must" : [
{
"terms" : {
"eventsId" : [
1, 2, 3, 4
],
"boost" : 1.0
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}