我在我的应用程序中使用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);