0

私は、JavaderbyDBとSwingインターフェイスおよびNetBeansIDEを使用するアプリケーションの検索エンジンとしてLucene3,6,2を使用しています。

今のところ、クエリに関するすべての情報を文字列データ型として取得できます。以下のコードを示します。

// create some index
        Directory index = new RAMDirectory();
        StandardAnalyzer analyzer = new StandardAnalyzer(matchVersion);
        IndexWriterConfig IWConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
        IndexWriter iw = new IndexWriter(index,IWConfig) ;

           try {

      con = DriverManager.getConnection(host, uName, uPass);

    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
     String sql = "SELECT * FROM APP.REGISTRY";
        rs = stmt.executeQuery(sql);

         rs.beforeFirst();
         while(rs.next()) {
         doc = new Document();
         doc.add(new Field("id",rs.getString("ID"),Field.Store.YES,Field.Index.ANALYZED));
         doc.add(new Field("subject",rs.getString("SUBJECT"),Field.Store.YES,Field.Index.ANALYZED));
         doc.add(new Field("letter_from",rs.getString("LETTER_FROM"),Field.Store.YES,Field.Index.ANALYZED));
         doc.add(new Field("date_of_letter",rs.getString("DATE_OF_LETTER"),Field.Store.YES,Field.Index.ANALYZED));        
         doc.add(new Field("date_received",rs.getString("DATE_RECEIVED"),Field.Store.YES,Field.Index.ANALYZED));

しかし、日付列があり、文字列データ型ではなく、日付データ型として日付列からデータを取得したいと思います。

これを達成する方法についての提案。

4

3 に答える 3

1

これを行うには、日付をlongに変換し(Date.getTime())、それらをNumericFieldとして保存します。

NumericField letterDateField = new NumericField("date_of_letter",Field.Store.YES,true);
letterDateField.setLongValue(rs.getDate("DATE_OF_LETTER").getTime());
doc.add(letterDateField);
NumericField receivedDateField = new NumericField("date_received",Field.Store.YES,true);
receivedDateField.setLongValue(rs.getDate("DATE_RECEIVED").getTime());
doc.add(receivedDateField);

時間を取り戻すには、長い値を取得し、それを使用して新しい日付を作成します。

Date letterDate = new Date(doc.getField("date_of_letter").numericValue().longValue());

範囲を検索するときは、次のように、比較のために値をlongにも変換する必要があります。

NumericRangeQuery.newLongRange("date_of_letter",minDate.getTime(),maxDate.getTime(),true,false)

または、必要に応じて、日付のコンポーネントを個別のフィールド(つまり、年フィールド、月フィールド、日フィールドなど)に格納することもできます。これにより、日付の数値を保存する場合に困難または不可能になるクエリを設計できます(たとえば、任意の年の2月の日付で何かをクエリする場合など)。

個人的には、NumericUtilsを直接使用しないことをお勧めします。

于 2013-03-21T15:35:00.723 に答える
0

をご覧くださいNumericField。数値フィールドを使用すると、範囲クエリを実行できます(データ型がの場合はまったく異なる動作をしますString)。

NumericUtils.longToPrefixCoded静的メソッドを使用して、日付をタイムスタンプに変換できます。

于 2013-03-21T10:23:11.863 に答える
0

これは、DateToolsを使用して日付にインデックスを付けるためのより良い方法です。

これを使用して日付を文字列に変換すると、(数値ではなく辞書式の)範囲として検索することも、個々の用語を検索することもできます。日付範囲の処理方法については、 QueryParserのドキュメントをご覧ください。

次のように、日付値をインデックスに追加できます。

doc.add(new Field("date_of_letter",DateTools.dateToString(rs.getDate("DATE_RECEIVED"),DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED));        
doc.add(new Field("date_received",DateTools.dateToString(rs.getDate("DATE_RECEIVED"),DateTools.Resolution.DAY),Field.Store.YES,Field.Index.ANALYZED));

同様に、値を日付に変換し直します

DateTools.stringToTime(dateResult);
于 2013-03-25T21:17:35.640 に答える