Lucene查询由Solr索引的DateField

时间:2012-10-18 11:24:43

标签: solr lucene

我们正在为各种搜索应用程序使用solr索引。在大多数情况下,我们就像使用管理界面一样使用它。 例如:

+text:Mr +text:burns +publish_date[2012-09-10T00:00:00Z TO 2012-10-10T00:00:00Z]

这很好用 我的问题是,在一个应用程序中,我们直接对索引使用复杂的lucene查询(不使用solr),在这些查询中,我无法找到如何搜索日期字段。
在schema.xml中:

<field name="publish_date" type="date" indexed="true" stored="true"/>

似乎solr将日期存储为unix时间(以毫秒为单位),当从索引中提取字段时,它看起来像 1336867200000

在lucene中,我尝试过每一个我能想到的查询:

TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800000", "1336867200000", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800", "1336867200", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "2012-09-10T00:00:00Z", "2012-10-10T00:00:00Z", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "20120910", "20121010", true, true);
NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800, 1336867200, true, true);

以及其他一些尝试......
返回结果的唯一查询是

TermRangeQuery nq1 = new TermRangeQuery("publish_date",  null, null, true, true);

当然这是一个带有“开放端点”的查询,但似乎应用该字段被索引为字符串(同样不适用于int-range或long-range)。 令人沮丧的是,它显然是可能的,我只需要弄清楚剂量solr如何预先形成它的日期范围。
任何人都知道如何进行此搜索? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

“1336867200000”是时间戳,是的。

TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800000", "1336867200000", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800", "1336867200", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "2012-09-10T00:00:00Z", "2012-10-10T00:00:00Z", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "20120910", "20121010", true, true);

以上版本无效,因为您正在使用数字数据的字符串参数。

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800, 1336867200, true, true);

这个不起作用,因为你没有用足够的零填充它。 1299628800代表Fri Jan 16 02:00:28 GMT 1970.

如果您的文件的日期为09/03/2011至13/05/2012,则以下内容应有效:

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800000L, 1336867200000L, true, true);