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

Elasticsearch Nested查询:限制嵌套Orders数量及指定Orderbook查询

Hey,我来帮你搞定这几个Elasticsearch嵌套查询的问题,结合你给出的数据结构和现有查询来调整,一步步来:

先明确你的数据结构:

Orderbook
└── Orders (Nested类型)
问题1:让每个Orderbook仅返回前5个Orders

你现在的初始查询会返回完整的Orderbook文档,包含所有嵌套的Orders。要实现只返回每个Orderbook的前5个Orders,得借助nested查询配合inner_hits来控制嵌套文档的返回数量,同时可以通过_source设置屏蔽原始文档里的全部Orders,只保留你需要的Orderbook字段和inner hits结果。

调整后的查询示例:

GET /orderindex/_search
{
  "size": 10,
  "_source": ["*", "!orders"], // 排除_source中的orders字段,保留Orderbook其他字段
  "query": {
    "bool": {
      "must": [
        { "term": { "_type": "orderbook" } },
        {
          "nested": {
            "path": "orders",
            "query": { "match_all": {} },
            "inner_hits": { "size": 5 } // 指定返回前5个Orders
          }
        }
      ]
    }
  }
}

这样查询后,每个Orderbook的_source里不会包含全部Orders,而是在inner_hits中只返回前5条嵌套的Orders数据。

问题2:查询两个指定label的Orderbook,且每个仅返回前2个Orders

这个需求需要在查询里添加对label字段的匹配(假设label是Orderbook层级的字段),同时保持inner_hits的size为2。示例如下:

GET /orderindex/_search
{
  "_source": ["*", "!orders"],
  "query": {
    "bool": {
      "must": [
        { "term": { "_type": "orderbook" } },
        { "terms": { "label": ["label1", "label2"] } }, // 匹配指定的两个label
        {
          "nested": {
            "path": "orders",
            "query": { "match_all": {} },
            "inner_hits": { "size": 2 } // 每个返回前2个Orders
          }
        }
      ]
    }
  }
}

如果label是嵌套在Orders里的字段,那需要把label的查询放到nested内部的query里,不过根据你的需求描述,应该是Orderbook层级的label,所以上面的写法就可以满足需求。

问题3:仅返回inner hits的2个Orders,不返回_source中的全部Orders

你当前的嵌套查询会同时返回完整的Orderbook文档(包含所有Orders)和inner hits。要只保留inner hits的结果,有两种灵活的方式:

方式1:直接关闭_source返回

如果你不需要Orderbook的任何其他字段,直接关闭_source即可:

GET /orderindex/_search
{
  "_source": false, // 不返回原始文档的source内容
  "query": {
    "bool": {
      "must": [
        { "term": { "_type": "orderbook" } },
        {
          "nested": {
            "path": "orders",
            "query": { "match_all": {} },
            "inner_hits": { "size": 2 }
          }
        }
      ]
    }
  }
}

方式2:保留Orderbook其他字段,仅排除Orders

如果你还需要Orderbook的部分字段(比如ID、时间戳等),可以用_source的包含/排除规则精准控制:

GET /orderindex/_search
{
  "_source": ["orderbook_id", "timestamp"], // 列出你需要保留的Orderbook字段
  // 或者用排除写法:"_source": ["*", "!orders"]
  "query": {
    "bool": {
      "must": [
        { "term": { "_type": "orderbook" } },
        {
          "nested": {
            "path": "orders",
            "query": { "match_all": {} },
            "inner_hits": { "size": 2 }
          }
        }
      ]
    }
  }
}

这样返回的结果里,_source只会包含你指定的Orderbook字段,不会有全部Orders,同时inner_hits里是筛选后的2个Orders。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:14:38