首页 文章

每日索引中的文档

提问于
浏览
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);
}

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

Is there a way to get the cumulative amount of documents in the index per day?

2 回答

  • 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 ,并在生成运行总计列表时仍然忽略文档总数(仍然向后) .

  • 2

    根据您的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)))))

    后一个函数转换为毫秒和舍入到当天 . 返回的组数量是您想要的 . 您可以根据需要在上个月等过滤它

相关问题