java – Lucene中的索引和搜索日期

前端之家收集整理的这篇文章主要介绍了java – Lucene中的索引和搜索日期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试使用DateTools.dateToString()方法索引日期.它的工作正常索引和搜索.

但是我已经编入索引的数据有一些引用,就是将Date作为一个新的Date().getTime()进行索引.

所以我的问题是如何对这个数据执行RangeSearch Query

任何解决这个?

提前致谢.

解决方法

您需要在您的日期字段上使用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,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);
    }
}

猜你在找的Java相关文章