我尝试用DateTools.dateToString()
方法将日期编入索引。它适用于索引和搜索。
但我已经编入索引的数据有一些参考资料,它将Date作为新的Date().getTime()
编入索引。
所以我的问题是如何对这些数据执行RangeSearch Query
...
任何解决方案???
先谢谢。
答案 0 :(得分:18)
您需要在日期字段中使用TermRangeQuery
。该字段始终需要使用DateTools.dateToString()
编制索引才能正常工作。以下是使用Lucene 3.0对日期范围进行索引和搜索的完整示例:
public class LuceneDateRange {
public static void main(String[] args) throws Exception {
// setup Lucene to use an in-memory index
Directory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
MaxFieldLength mlf = MaxFieldLength.UNLIMITED;
IndexWriter writer = new IndexWriter(directory, analyzer, true, mlf);
// use the current time as the base of dates for this example
long baseTime = System.currentTimeMillis();
// index 10 documents with 1 second between dates
for (int i = 0; i < 10; i++) {
Document doc = new Document();
String id = String.valueOf(i);
String date = buildDate(baseTime + i * 1000);
doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED));
doc.add(new Field("date", date, Store.YES, Index.NOT_ANALYZED));
writer.addDocument(doc);
}
writer.close();
// search for documents from 5 to 8 seconds after base, inclusive
IndexSearcher searcher = new IndexSearcher(directory);
String lowerDate = buildDate(baseTime + 5000);
String upperDate = buildDate(baseTime + 8000);
boolean includeLower = true;
boolean includeUpper = true;
TermRangeQuery query = new TermRangeQuery("date",
lowerDate, upperDate, includeLower, includeUpper);
// display search results
TopDocs topDocs = searcher.search(query, 10);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc);
}
}
public static String buildDate(long time) {
return DateTools.dateToString(new Date(time), Resolution.SECOND);
}
}
答案 1 :(得分:3)
如果您使用NumericField作为日期,然后使用NumericRangeFilter / Query进行范围搜索,您将获得更好的搜索性能。
您只需要将日期编码为long或int。一种简单的方法是调用Date的.getTime()方法,但这可能比你需要的分辨率(毫秒)要多得多。如果您只需要一天,您可以将其编码为YYYYMMDD整数。
然后,在搜索时,在开始/结束日期进行相同的转换并运行NumericRangeQuery / Filter。