0

我在使用 java derby DB 和 swing 接口以及 netbeans IDE 的应用程序中使用 Lucene 3、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

您可以通过将日期转换为长整数 (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 回答