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を使用するのは良い考えですか?
次の 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 を使用していない場合は、それに取り組むことはお勧めしません。