You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch中如何正确组合$and与$or实现等效MongoDB查询

问题描述

我是Elasticsearch初学者,需要将如下MongoDB查询转换为等效的Elasticsearch查询,其中addresses为字符串类型数组:

let TXs = await db.collection("transactions").find({
        $or: [
          {"sender.wallet.address": {$in: addresses}, currency: currency},
          {"receiver.wallet.address": {$in: addresses}, currency: currency}
        ]
      }).sort({unix: 1}).toArray().catch(console.error);

我编写的ES查询代码执行时报错:

let TXs = await elasticClient.search({
      index: elasticIndex,
      "query": {
        "terms": {
          "should": [
            {"bool": {"must": [{"term": {"sender.wallet.address": addresses}}, {"term": {"currency": currency}}]}},
            {"bool": {"must": [{"term": {"receiver.wallet.address": addresses}}, {"term": {"currency": currency}}]}}
          ]
        }
      }
    }).catch(console.error);

报错信息:

ResponseError: parsing_exception: [parsing_exception] Reason: Unknown key for a END_ARRAY in [query].

错误原因
  • 查询结构嵌套错误:MongoDB的$or对应ES中bool查询的should子句,错误将should放在了terms查询内部,terms是单字段多值精确匹配查询,不支持嵌套布尔逻辑
  • 查询类型使用错误:匹配数组入参addresses需要用terms查询,term查询仅支持单个精确值匹配,无法直接传入数组
  • 遗漏排序逻辑:原Mongo查询包含按unix字段升序排序的规则,编写的ES查询未实现该逻辑
  • 公共条件冗余:两个或分支都要求currency字段匹配,无需在每个分支重复声明,可以提取到公共查询条件中
正确查询写法
let TXs = await elasticClient.search({
  index: elasticIndex,
  query: {
    bool: {
      must: [
        // 公共条件:currency字段精确匹配
        { term: { currency: currency } }
      ],
      should: [
        // 分支1:发送方地址在addresses列表中
        { terms: { "sender.wallet.address": addresses } },
        // 分支2:接收方地址在addresses列表中
        { terms: { "receiver.wallet.address": addresses } }
      ],
      // 必须命中should分支中的至少1个,等价于Mongo的$or逻辑
      minimum_should_match: 1
    }
  },
  // 按unix字段升序排序,等价于原Mongo的sort({unix:1})
  sort: [
    { unix: { order: "asc" } }
  ]
}).catch(console.error);
  • 注意事项:请提前确认sender.wallet.address、receiver.wallet.address、currency三个字段在ES映射中是keyword类型,如果是text类型会走分词,无法做精确匹配。

内容的提问来源于stack exchange,提问作者weera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:51:19