1

我想在 Lucene 4.10 中以编程方式为日期字段构建范围查询,但无论如何我都没有找到这样做。我的伪代码是:

new DateRangeQuery(dateLowerBound, dateUpperBound);

使用org.apache.lucene.document.DateTool类对其进行转换然后使用NumericRangeQuery是个好主意吗?

4

1 回答 1

2

我会选择以下两种可能性之一:

1 -DateTools用于获取有利于索引的字符串表示:

String indexableDateString = DateTools.dateToString(theDate, DateTools.Resolution.MINUTE);
doc.add(new StringField("importantDate", indexableDateString, Field.Store.YES));
...
TopDocs results = indexSearcher.search(new TermRangeQuery(
    "importantDate",
    new BytesRef(DateTools.dateToString(lowDate, DateTools.Resolution.MINUTE)),
    new BytesRef(DateTools.dateToString(highDate, DateTools.Resolution.MINUTE)),
    true,
    false
));
...
Field dateField = resultDocument.getField("importantDate")
Date retrievedDate = DateTools.stringToDate(dateField.stringValue());

Date.getTime()2 - 跳过日期工具,并使用orCalendar.getTimeInMillis()或类似的东西将日期索引为数值:

long indexableDateValue = theDate.getTime();
doc.add(new LongField("importantDate", indexableDateValue, Field.Store.YES));
...
TopDocs results = indexSearcher.search(NumericRangeQuery.newLongRange(
    "importantDate",
    lowDate.getTime(),
    highDate.getTime(),
    true,
    false
));
...
Field dateField = resultDocument.getField("importantDate")
Date retrievedDate = new Date(dateField.numericValue());

我通常会选择第一个,因为它使对精度的控制更加明显,但是无论您喜欢哪个都应该可以正常工作。

另外值得一提的是 solr's TrieDateField,但如果您还没有使用 solr,我真的不建议您使用它。

于 2014-09-22T16:18:47.103 回答