我想在 Lucene 4.10 中以编程方式为日期字段构建范围查询,但无论如何我都没有找到这样做。我的伪代码是:
new DateRangeQuery(dateLowerBound, dateUpperBound);
使用org.apache.lucene.document.DateTool类对其进行转换然后使用NumericRangeQuery是个好主意吗?
我想在 Lucene 4.10 中以编程方式为日期字段构建范围查询,但无论如何我都没有找到这样做。我的伪代码是:
new DateRangeQuery(dateLowerBound, dateUpperBound);
使用org.apache.lucene.document.DateTool类对其进行转换然后使用NumericRangeQuery是个好主意吗?
我会选择以下两种可能性之一:
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,我真的不建议您使用它。