首页 文章

Lucene查询由Solr索引的DateField

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

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

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代表Fri Jan 16 02:00:28 GMT 1970 .

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

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

相关问题