ES-termsQuery

文章讲述了在将Oracle查询转换为ElasticsearchDSL时,遇到TermsQuery异常的问题,原因是使用三目表达式导致参数类型不匹配。解决方案是对外部参数进行空判断并确保类型一致,避免使用Object类型的重载方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

需要将现有列表查询数据源由ORACLE替换为ES,相应SQL转换为ES的DSL语句。


问题描述

SQL IN :QueryBuilders.termsQuery() 时异常。
[terms] unknown token [END_ARRAY] after [XXX]

List<String> list = new ArrayList<>();
        SearchSourceBuilder dsl = new SearchSourceBuilder();
        dsl.query(QueryBuilders.termsQuery("xxx", StringUtils.isEmpty(list) ? "" : list));

原因分析:

查看源码发现QueryBuilders.termsQuery有很多重载方法

    public static TermsQueryBuilder termsQuery(String name, Object... values) {
        return new TermsQueryBuilder(name, values);
    }
    public static TermsQueryBuilder termsQuery(String name, Collection<?> values) {
        return new TermsQueryBuilder(name, values);
    }

使用三目表达式返回结果类型不同,统一走Object类型的重载方法,查看其源码发现对入参直接包装 成了List。相当于在原有list基础上又包装了一层,导致问题出现。

 public TermsQueryBuilder(String fieldName, Object... values) {
        this(fieldName, values != null ? Arrays.asList(values) : (Iterable<?>) null);
    }
}
DSL语句对比
  异常情况:{
  "terms" : {
    "xxx" : [
      [
        "asd"
      ]
    ],
    "boost" : 1.0
  }
  想要的结果:
  {
  "terms" : {
    "xxx" : [
      "asd"
    ],
    "boost" : 1.0
  }
}

解决方案:

本就该对参数在外层进行判空,脑子抽了写在里面了。

if (StringUtils.isNotEmpty(list)){
	//这么写底层走的是 Collection类型的重载方法
    QueryBuilders.termsQuery("xxx", list);
    ...
}

备注:QueryBuilders.termsQuery()若查询参数为多个时,最好确保参数类型保持一致,让ES走正确的重载方法。使用三目表达式作为参数,最好确保参数类型也一直否则会走 Object类型的重载方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值