每日索引中的文档

时间:2013-03-11 07:14:17

标签: search solr search-engine

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);
}

然而,这种方法看起来非常脆弱,容易出错。

有没有办法每天获取索引中的累计文档数量?

2 个答案:

答案 0 :(得分:2)

我认为有一种比分面更好的方法来取出日常计数,并且使用日期数学比计算特定日期字符串的任何尝试都要好,所以我认为你已经在这些方面做得对。

关于我能看到的唯一改进是查询*:*并获取该命中数,然后您可以使用每日计数通过减法向后生成您的运行总计,而不是向前添加。这应该比您的方法稍好一些,因为*:*根本不需要过滤工作或得分计算。它还为您提供了一个更少的日期数学表达式来写:)

说到我怀疑NOW/MONTH-1MONTH并不是你的意思。这说:“现在已经四舍五入到当月减去一个月”。这将是28至61天前的任何地方,具体取决于现在的日期(考虑NOW是3月1日对比12月31日,你分别得到2月1日或11月1日)。这与您声明的要求不符:

  

我需要知道每天索引中有多少文件   一个月前直到今天

我想你可能想要NOW/DAY-1MONTH。而且,似乎你用你的方面的上限排除今天的文件...是否需要? (如果是这样,我的方法仍然有效,但你必须将方面的上限扩展到NOW/DAY+1DAY,并在生成运行总计列表时仍然忽略文档总数(仍然向后)。

答案 1 :(得分:2)

根据您的Solr版本,您可以将grouping aka Field Collapsing与group.func参数结合使用。 http://wiki.apache.org/solr/FieldCollapsing

set rows = 0&amp; group.field = added&amp; group.func = rint(div(ms(added),mul(24,mul(60,mul(60,1000)))))

后一个函数转换为毫秒和舍入到当天。 返回的组数量是您想要的。您可以按照自己喜欢的方式按上个月等过滤它