如何在Solr中实现按物料分组并获取近两年最低单价?
用Solr实现按物料分组并获取近两年内最低价格文档
完全可以实现,借助Solr的**分组(Grouping)**功能结合过滤条件就能满足你的需求,以下是具体实现步骤:
核心查询参数
将以下参数拼接在Solr查询URL后(例如http://your-solr-url/solr/your-core/select?):
q=*:* &fq=received_date_dt:[NOW-2YEAR TO NOW] &group=true &group.field=material_name_s &group.sort=price_per_lb_value_f asc &group.limit=1 &group.format=simple &fl=material_name_s,company_name_s,price_per_lb_value_f,received_date_dt
参数说明
q=*:*:匹配所有文档,后续通过过滤条件缩小范围fq=received_date_dt:[NOW-2YEAR TO NOW]:过滤出近两年内的记录,Solr支持用NOW表示当前服务器时间,NOW-2YEAR自动计算当前时间往前推2年的时间点;如果需要固定区间,可替换为具体日期,比如[2022-01-01T00:00:00Z TO 2024-01-01T00:00:00Z]group=true:开启分组功能group.field=material_name_s:指定按物料名称字段分组group.sort=price_per_lb_value_f asc:每个分组内按价格升序排序,确保最低价格的文档排在分组内第一位group.limit=1:每个分组仅返回第一条结果(即最低价格的记录)group.format=simple:将分组结果合并到response.docs中,结构更贴近你期望的输出fl:指定返回的字段列表,只保留业务需要的字段,减少数据传输量
示例返回结果
执行上述查询后,返回结果结构会与你期望的一致:
{"response": {"numFound": 2, "start": 0, "numFoundExact": true, "docs": [ {"material_name_s":"MaterialName1", "company_name_s": "CompanyName3", "price_per_lb_value_f": 3.33, "received_date_dt": "2021-01-01T00:00:00Z"}, {"material_name_s":"MaterialName2", "company_name_s": "CompanyName2", "price_per_lb_value_f": 5.55, "received_date_dt": "2021-01-01T00:00:00Z"} ]}}
注意事项
- 确保
received_date_dt字段在Solr schema中配置为date类型,否则时间范围查询无法生效 - 确保
material_name_s字段的indexed属性设置为true,否则无法作为分组字段使用
内容的提问来源于stack exchange,提问作者gib
相关产品推荐
相关产品推荐

