1

日付による検索を意味する検索方法に時間制限を追加しようとしています。lucene は文字列しか処理できないことはわかっていますが、最初に日付を文字列に変換しています。しかし、まだ機能していません。コード ベースが複雑なため、なぜ機能していないのかよくわかりません。簡単なバージョンは次のとおりです。

@Indexed
public class SomeDocument extends Document{
}

public abstract class Document extends BaseEntity{
}

@Indexed
public class BaseEntity {

@IndexedEmbedded
private Date lastUpdatedDate;
}

//snippet of search method
BooleanQuery bq = new BooleanQuery();    
long oneDay = 1000L * 60 * 60 * 24;
long currentTime = System.currentTimeMillis();
Date dateOne = new Date(currentTime);
Date dateTwo = new Date(currentTime - (oneDay * 7)); // 1 week ago ago    
TermRangeQuery dateQuery = new TermRangeQuery("lastUpdatedDate", dateTwo.toString(),    dateOne.toString(), true, true);
bq.add(new BooleanClause(dateQuery, BooleanClause.Occur.MUST));

//more is added to boolean query, I create a full text query, and use the list() method

正しく実装されていない場所を見た人はいますか? ありがとうございました!

4

2 に答える 2

1

を使用する代わりにDate.toString()、日付文字列を生成するには、Lucene のDateTools.DateToString. Date.toStringは "yyyy-mm-dd" 形式で日付を生成しますが、Lucene のDateTools形式は "yyyyMMddHHmmssSSS" 形式で日付をフォーマットします。これは、一般的なアナライザーで効果的にクエリを実行するのにより適しています。何かのようなもの:

String dateOneString = DateTools.dateToString(dateOne, DateTools.Resolution.MILLISECOND);
String dateTwoString = DateTools.dateToString(dateTwo, DateTools.Resolution.MILLISECOND);
TermRangeQuery dateQuery = new TermRangeQuery("lastUpdateDate", dateTwoString,  dateOneString, true, true);

デフォルトの日付解像度は だと思いますResolution.MILLISECONDこれは@DateBridge アノテーションで変更できます。

于 2013-11-05T16:58:37.620 に答える