存储指定时段文档出现次数:Solr字段类型与存储格式咨询
基于Solr实现指定时间段文档出现次数统计的方案
核心字段设计
首先需要定义两个关键字段支撑统计需求:
doc_unique_id:字段类型为string(精确匹配、不分词),用于标记重复文档的唯一标识,确保相同文档拥有完全一致的ID值。doc_date:字段类型为date,存储文档被处理的ISO 8601格式日期时间(例如2022-10-16T00:00:00Z),支持后续日期范围过滤与时间维度聚合。
Schema定义示例:
<field name="doc_unique_id" type="string" indexed="true" stored="true"/> <field name="doc_date" type="date" indexed="true" stored="true"/>
两种实现统计的方式
方式1:查询时实时聚合(推荐)
无需预先存储次数,直接利用Solr的Facet聚合功能,在查询时实时计算指定时间段内各文档的出现次数,灵活性拉满,完全适配任意日期/时间段的统计需求。
查询单日(2022/10/16)出现次数最多的文档:
q=*:* &fq=doc_date:[2022-10-16T00:00:00Z TO 2022-10-16T23:59:59Z] &facet=true &facet.field=doc_unique_id &facet.limit=10 # 控制返回前N个高频文档 &facet.sort=count desc
查询时间段(2022/10/16~2022/10/23)出现次数最多的文档:
q=*:* &fq=doc_date:[2022-10-16T00:00:00Z TO 2022-10-23T23:59:59Z] &facet=true &facet.field=doc_unique_id &facet.limit=10 &facet.sort=count desc
优势:无需额外维护计数逻辑,支持任意时间段统计;每日数千文档的量级下,性能完全够用。
方式2:预先存储每日计数(仅适用于固定日期维度场景)
如果对查询性能有极致要求,可以预先在Solr中存储每个文档的每日出现次数,通过动态字段实现:
- 定义动态字段
date_count_*,类型为int,用于存储对应日期的次数(例如date_count_20221016对应2022-10-16的次数)。 - 每日处理文档时,使用Solr的Atomic Update功能累加对应日期的计数:
curl -X POST -H "Content-Type: application/json" http://solr-host:8983/solr/collection/update -d ' [ { "doc_unique_id": "DOC123", "date_count_20221016": {"inc": 1} } ] '
缺点:维护成本高,仅支持单日期统计,跨时间段统计需要手动累加多个字段值,灵活性不足。
字段类型说明
string类型:确保doc_unique_id的精确匹配,避免分词导致的重复文档识别错误。date类型:原生支持范围查询、排序,是处理时间维度需求的最优选择,存储时必须遵循ISO 8601格式(简化的2022-10-16格式也可被Solr自动解析为当天0点)。int类型:用于预先存储计数时,保证数值存储的高效性。
内容的提问来源于stack exchange,提问作者sanjihan
相关产品推荐
相关产品推荐

