Дата индексирования и поиска в Lucene

Я попробовал его индексировать дату с помощью метода DateTools.dateToString(). Он работает правильно для индексирования, а также для поиска.

Но мои уже проиндексированные данные, имеющие некоторые ссылки, таким образом, что он индексировал Date как новый Date().getTime().

Итак, моя проблема заключается в том, как выполнить RangeSearch Query по этим данным...

Любое решение этого вопроса

Спасибо в Advance.

Ответ 1

Вам нужно использовать 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);
    }
}

Ответ 2

Вы получите гораздо лучшую производительность поиска, если вы используете NumericField для вашей даты, а затем NumericRangeFilter/Query для поиска диапазона.

Вам просто нужно закодировать свою дату как long или int. Одним из простых способов является вызов метода .getTime() вашей даты, но это может быть гораздо больше разрешения (миллисекунд), чем вам нужно. Если вам нужно только до дня, вы можете закодировать его как целое число YYYYMMDD.

Затем во время поиска сделайте то же самое преобразование в начале/конце Даты и запустите NumericRangeQuery/Filter.