Elasticsearch如何查询指定entity_id下number为最大值的文档
Elasticsearch 实现指定entity_id下匹配number最大值文档的方法
你可以用以下两种方式实现和对应PostgreSQL SQL完全一致的查询效果:
方案1:两步查询(逻辑直观,零踩坑,适合新手)
逻辑和你写的SQL子查询逻辑完全对齐,第一步先算最大值,第二步查对应文档,两次请求都是轻量查询,性能开销很低。
- 第一步:查询指定entity_id下number字段的最大值
直接用max聚合,不返回原始文档,只返回聚合结果:
从返回结果的GET /index_logs/_search { "size": 0, "query": { "term": { "entity_id": "<替换为你要查询的具体entity_id值>" } }, "aggs": { "current_max_number": { "max": { "field": "number" } } } }aggregations.current_max_number.value字段就能拿到当前entity_id对应的最大number值,比如查询id_1时返回值为2,查询id_2时返回值为25。 - 第二步:根据拿到的最大值过滤目标文档
把上一步拿到的最大值作为查询条件,直接过滤匹配的文档即可:GET /index_logs/_search { "query": { "bool": { "filter": [ {"term": {"entity_id": "<替换为你要查询的具体entity_id值>"}}, {"term": {"number": "<上一步查询得到的最大值>"}} ] } } }
方案2:单请求查询(无需提前计算最大值,一次请求返回结果)
如果不想发两次请求,可以用排序+字段折叠的能力实现,一次请求直接拿到结果:
GET /index_logs/_search { "query": { "term": { "entity_id": "<替换为你要查询的具体entity_id值>" } }, "sort": [ {"number": {"order": "desc"}} ], "collapse": { "field": "entity_id", "inner_hits": { "name": "max_value_docs", "size": 100 } }, "size": 1 }
返回结果中hits.hits[0].inner_hits.max_value_docs.hits数组就是所有符合要求的文档。
注意事项
- 如果你的
entity_id字段是text类型,写term查询时需要使用entity_id.keyword字段,否则会因为分词导致匹配结果不准 - 单请求方案中inner_hits的size值需要大于同一entity_id下相同最大number值的文档总数,否则会出现结果截断,如果你不确定同值文档的数量,优先用两步查询的方案,不会出现漏数问题。
内容的提问来源于stack exchange,提问作者Prosto_Oleg
相关产品推荐
相关产品推荐

