Elasticsearch查询最新PR中各结果首次出现对应PR号方案咨询
推荐采用第一种存储方案(单结果单文档),几乎所有计算逻辑都可以直接交给Elasticsearch完成,仅需少量查询结果拼接操作。
具体实现流程:
- 先查询最新的PR编号:
GET test/_search { "size": 0, "aggs": { "latest_pr": { "max": { "field": "PR" } } } }
按照你给出的示例,查询结果会返回最新PR为4。
- 拉取最新PR包含的所有结果值:
GET test/_search { "query": { "term": { "PR": 4 } }, "_source": ["result"] }
返回的结果提取后就是最新存在的结果集合:["bar", "eggs"]。
- 批量查询上述结果各自首次出现的最小PR编号:
GET test/_search { "size": 0, "query": { "terms": { "result": ["bar", "eggs"] } }, "aggs": { "group_by_result": { "terms": { "field": "result", "size": 1000 // 可根据实际结果数量调整上限 }, "aggs": { "first_appear_pr": { "min": { "field": "PR" } } } } } }
聚合返回的结果会直接给出每个结果对应的首次PR编号:bar对应1,eggs对应3,完全符合你期望的输出要求。
第二种存储方案的问题:
如果采用单PR存数组的方案,实现相同需求需要用到runtime fields或者脚本聚合,性能会比第一种方案低1~2个数量级,数据量大的时候不推荐使用。
注意事项:
索引创建时需要把PR字段和result字段设置为keyword类型,避免text类型分词导致聚合异常。
内容的提问来源于stack exchange,提问作者baruchiro
相关产品推荐
相关产品推荐

