Elasticsearch Nested查询:限制嵌套Orders数量及指定Orderbook查询
Hey,我来帮你搞定这几个Elasticsearch嵌套查询的问题,结合你给出的数据结构和现有查询来调整,一步步来:
先明确你的数据结构:
Orderbook └── Orders (Nested类型)
你现在的初始查询会返回完整的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数据。
这个需求需要在查询里添加对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,所以上面的写法就可以满足需求。
你当前的嵌套查询会同时返回完整的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

