2

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

然而,这种方法似乎非常脆弱并且容易出错。

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

4

2 回答 2

2

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

设置行=0&group.field=add&group.func=rint(div(ms(add),mul(24,mul(60,mul(60,1000)))))

后一个函数转换为毫秒并舍入到一天。返回的组数是您想要的。您可以根据需要按上个月等过滤

于 2013-03-19T14:34:57.807 回答
2

我认为没有比 faceting 更好的方法来提取每日计数,并且使用日期数学比计算特定日期字符串的任何尝试都更可取,所以我认为你已经在这些方面做得对了。

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

说到这我怀疑NOW/MONTH-1MONTH不是你的意思。那说:“现在四舍五入到当月的开始减去一个月”。这将是 28 到 61 天前的任何时间,具体取决于现在是哪一天(考虑NOW是 3 月 1 日还是 12 月 31 日,您分别得到 2 月 1 日或 11 月 1 日)。这不符合您提出的要求:

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

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

于 2013-03-16T03:17:41.430 回答