1

Lucene 4.10 でプログラムによって日付フィールドの範囲クエリを作成したいのですが、とにかくそれを行う方法が見つかりませんでした。私の疑似コードは次のようになります。

new DateRangeQuery(dateLowerBound, dateUpperBound);

org.apache.lucene.document.DateToolクラスを使用して変換し、NumericRangeQueryを使用するのは良い考えですか?

4

1 に答える 1

2

次の 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 - 日付ツールをスキップし、またはなどを使用して日付を数値としてインデックス付けしますCalendar.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'sTrieDateFieldですが、まだ solr を使用していない場合は、それに取り組むことはお勧めしません。

于 2014-09-22T16:18:47.103 に答える