Solr索引中的所有文档都有一个“已添加”字段,其中包含将文档添加到Solr的ISO 8601日期 .
<result name="response" numFound="34587104" start="0">
<doc>
<date name="added">2013-03-04T01:00:26Z</date>
<str name="text">Hello, world!</str>
<str name="id">93416604d274d28a44e14a9535bb9e6e1db3d851</str>
<str name="_version_">1428536769315340290</str>
</doc>
<result/>
假设没有删除任何文档,我如何计算每天索引中存在多少文档?例如,为了知道2013-03-05中索引中有多少文档,我可以查询 q=added:[* TO 2013-03-05T00:00:00Z]
. 但是,我需要知道从一个月前到今天每天索引中有多少文档 .
一种解决方案可能是在一个月前查询索引中有多少文档,然后分析每天添加的文档数量,然后将它们添加到累积计数中 . 伪代码:
initial_count = q=added:[* TO NOW/MONTH-1MONTH]
running_total = initial_count;
daily_added_array = facet.range=added
& f.added.facet.range.start=NOW/MONTH-1MONTH
& f.added.facet.range.end=NOW/DAY-1DAY
& f.added.facet.range.gap=+1DAY
foreach (daily_added_array as day) {
running_total += day;
printf(running_total);
}
然而,这种方法似乎非常脆弱,容易出错 .
Is there a way to get the cumulative amount of documents in the index per day?
2 回答
我认为有一个比分面更好的方法来取出日常计数,并且使用日期数学比任何计算特定日期字符串的尝试都要好,所以我认为你已经在这些方面做得对 .
关于我能看到的唯一改进是查询
*:*
并从中获取命中数,然后您可以使用每日计数通过减法向后生成运行总计,而不是向前添加 . 这应该比你的方法好一点,因为*:*
根本不需要过滤工作或得分计算 . 它还为您提供了一个更少的日期数学表达式来写:)说到我怀疑
NOW/MONTH-1MONTH
并不是你的意思 . 那说:"NOW rounded to start of the current month minus one month" . 这将是28至61天前的任何地方,取决于现在是什么日子(考虑NOW
是3月1日对比12月31日,你分别得到2月1日或11月1日) . 这与您声明的要求不符:我想你可能想要
NOW/DAY-1MONTH
. 而且,似乎你用你的方面的上限排除今天的文件...是否需要? (如果是这样,我的方法仍然有效,但你必须将你的方面的上限扩展到NOW/DAY+1DAY
,并在生成运行总计列表时仍然忽略文档总数(仍然向后) .根据您的Solr版本,您可以将grouping aka Field Collapsing与group.func参数结合使用 . http://wiki.apache.org/solr/FieldCollapsing
set rows = 0&group.field = added&group.func = rint(div(ms(added),mul(24,mul(60,mul(60,1000)))))
后一个函数转换为毫秒和舍入到当天 . 返回的组数量是您想要的 . 您可以根据需要在上个月等过滤它