3

我们正在为各种搜索应用程序使用 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 的剂量是如何影响它的日期范围的。
任何人都知道如何执行此搜索?
任何帮助,将不胜感激。

4

1 回答 1

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 代表 1970 年 1 月 16 日星期五 02:00:28 GMT 1970。

如果您的文件日期在 2011 年 9 月 3 日至 2012 年 5 月 13 日之间,则以下内容应该有效:

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800000L, 1336867200000L, true, true);
于 2012-10-18T19:08:42.083 回答