欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一次神奇的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
  }
}