用lucene搜索从表中检索SQL日期数据类型



我在我的应用程序中使用Lucene 3,6,2作为搜索引擎使用java derby DB和swing接口和netbeans IDE。

现在我能够从关于查询中检索所有信息作为字符串数据类型。我给出下面的代码:

// 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));

,但有一个日期列,我想从日期列检索数据作为日期数据类型,而不是字符串数据类型。

关于如何做到这一点有什么建议吗?

您可以将日期转换为长时间(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());

在搜索范围时,还需要将用于比较的值转换为长值,例如:

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

或者,如果有必要,您可以将日期的组成部分存储在单独的字段中(例如。年份字段、月份字段、日期字段等)。这将允许您设计一些查询,这些查询在存储数字日期值时是困难的或不可能的(例如,如果您想查询任何年份中2月份的日期)。

我个人不建议直接使用NumericUtils

看看NumericField。使用数字字段,您将能够执行范围查询(如果数据类型是String,则其行为完全不同)。

您可以使用静态NumericUtils.longToPrefixCoded方法将日期转换为时间戳。

这可能是一个更好的索引日期的方法,使用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);

相关内容

  • 没有找到相关文章

最新更新