lqm526 2007-9-19 14:04
为自己的系统搞个全文搜索
[align=center][align=center][color=black][font=宋体][size=10.5pt]为自己的系统搞个全文搜索[/size][/font][/color][color=black][font=Arial][size=10.5pt][/size][/font][/color][/align][/align][color=black][font=Arial][size=10.5pt] [/size][/font][/color]
[align=left][align=left][color=black][font=宋体][size=10.5pt]在本文我又提到[/size][/font][/color][color=black][font=Arial][size=10.5pt]lucene[/size][/font][/color][color=black][font=宋体][size=10.5pt]了,在[/size][/font][/color][color=black][font=Arial][size=10.5pt]java[/size][/font][/color][color=black][font=宋体][size=10.5pt]业界,提到全文检索,几乎没有什么人不知道它。用[/size][/font][/color][color=black][font=Arial][size=10.5pt]google[/size][/font][/color][color=black][font=宋体][size=10.5pt]搜索一下,满世界都是有关资料。具有代表性的就是车东的[/size][/font][/color][color=black][font=Arial][size=10.5pt]“[/size][/font][/color][color=black][font=宋体][size=10.5pt]基于[/size][/font][/color][color=black][font=Arial][size=10.5pt]Java[/size][/font][/color][color=black][font=宋体][size=10.5pt]的全文索引引擎[/size][/font][/color][color=black][font=Arial][size=10.5pt]Lucene [/size][/font][/color][color=black][font=宋体][size=10.5pt]简介[/size][/font][/color][color=black][font=Arial][size=10.5pt]”[/size][/font][/color][color=black][font=宋体][size=10.5pt],我要写的也就只有最简单的三板斧,再加上支持中文的[/size][/font][/color][color=black][font=Arial][size=10.5pt]Chinese Analyzer [/size][/font][/color][color=black][font=宋体][size=10.5pt]以及按照时间排序的搜索结果排序方法。这些都可以在其他地方找到相关资料,我只是把他们提出来,作为[/size][/font][/color][color=black][font=Arial][size=10.5pt]lucence [/size][/font][/color][color=black][font=宋体][size=10.5pt]应用中经常遇到的麻烦解决办法。去年[/size][/font][/color][color=black][font=Arial][size=10.5pt]MSN[/size][/font][/color][color=black][font=宋体][size=10.5pt]上面有个朋友跟我提到希望用[/size][/font][/color][color=black][font=Arial][size=10.5pt]lucene[/size][/font][/color][color=black][font=宋体][size=10.5pt]构建个网站的全文检索,我当时就觉得很简单,直说没问题没问题,不过他提到一个要求就是搜索结果要安装时间排序,我查阅了些资料,发现[/size][/font][/color][color=black][font=Arial][size=10.5pt]lucene[/size][/font][/color][color=black][font=宋体][size=10.5pt]并不提供用户自定义排序方式,而只能按照自己相关性算法排序。后来我在车东的[/size][/font][/color][color=black][font=Arial][size=10.5pt]weblucene[/size][/font][/color][color=black][font=宋体][size=10.5pt]项目找到了[/size][/font][/color][color=black][font=Arial][size=10.5pt]IndexOrderSearcher[/size][/font][/color][color=black][font=宋体][size=10.5pt]。[/size][/font][/color][color=black][font=Arial][size=10.5pt][/size][/font][/color][/align][/align][align=left][align=left][color=black][font=宋体][size=10.5pt]解决了结果排序常规需求。[/size][/font][/color][color=black][font=Arial][size=10.5pt]IndexOrderSearcher[/size][/font][/color][color=black][font=宋体][size=10.5pt]跟一般[/size][/font][/color][color=black][font=Arial][size=10.5pt]IndexSearch[/size][/font][/color][color=black][font=宋体][size=10.5pt]使用差不多,仅仅在构建对象的时候多加一个参数[/size][/font][/color][color=black][font=Arial][size=10.5pt]IndexOrderSearcher.ORDER_BY_DOCID_DESC
IndexOrderSearcher indexsearcher = new IndexOrderSearcher("/home/lucenetest/index",IndexOrderSearcher.ORDER_BY_DOCID_DESC);
[/size][/font][/color][color=black][font=宋体][size=10.5pt]新版本的[/size][/font][/color][color=black][font=Arial][size=10.5pt]lucene[/size][/font][/color][color=black][font=宋体][size=10.5pt]还提供了一个[/size][/font][/color][color=black][font=Arial][size=10.5pt]MultiFieldQueryParser[/size][/font][/color][color=black][font=宋体][size=10.5pt],可以同时检索多个字段,以前[/size][/font][/color][color=black][font=Arial][size=10.5pt]QueryParser[/size][/font][/color][color=black][font=宋体][size=10.5pt]比较麻烦。[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]private[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]static[/size][/font][/color][color=black][font=Arial][size=10.5pt] ChineseAnalyzer chineseAnalyzer = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] ChineseAnalyzer();
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]public[/size][/font][/color][color=black][font=Arial][size=10.5pt] Hits search(String queryText){
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt] (queryText == [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt]){
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt];
}
Query query;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt]{
query = MultiFieldQueryParser.parse(queryText, [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] String[]{"title"},chineseAnalyzer);
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color][color=black][font=Arial][size=10.5pt] indexsearcher.search(query);
}[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt](Exception e){
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt];
}
}
[/size][/font][/color][color=black][font=宋体][size=10.5pt]下面是构建索引,定时从数据库取出数据索引,做完记录完成时间,我是把时间写入一个[/size][/font][/color][color=black][font=Arial][size=10.5pt]txt[/size][/font][/color][color=black][font=宋体][size=10.5pt]文件。[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]package[/size][/font][/color][color=black][font=Arial][size=10.5pt] com.test.search;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] org.apache.lucene.analysis.Analyzer;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] org.apache.lucene.analysis.cn.*;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] org.apache.lucene.analysis.standard.StandardAnalyzer;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] org.apache.lucene.document.*;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] org.apache.lucene.index.*;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] java.io.*;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] java.sql.*;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] java.util.Date;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] com.test.db.*;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]import[/size][/font][/color][color=black][font=Arial][size=10.5pt] com.test.utility.*;
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]/**
* Title: SearchIndexer
* Description: [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]全文索引[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]
* Copyright: Copyright (c) 2001
* Company: test
* @author Sean
* @version 1.0
*/[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]public[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]class[/size][/font][/color][color=black][font=Arial][size=10.5pt] SearchIndexer {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]private[/size][/font][/color][color=black][font=Arial][size=10.5pt] String indexPath = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt];
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]protected[/size][/font][/color][color=black][font=Arial][size=10.5pt] Analyzer analyzer = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] ChineseAnalyzer();
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]public[/size][/font][/color][color=black][font=Arial][size=10.5pt] SearchIndexer(String s) {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]this[/size][/font][/color][color=black][font=Arial][size=10.5pt].indexPath = s;
}
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]/**
* [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]索引某日期以前的所有文档[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]
* @param fromdate
* @return
*/[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]public[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]final[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]void[/size][/font][/color][color=black][font=Arial][size=10.5pt] updateIndex(String fromdate) {
Connection conn = DbUtil.getCon();
IndexWriter indexWriter = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt];
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
indexWriter = getWriter([/size][/font][/color][color=blue][font=Arial][size=10.5pt]false[/size][/font][/color][color=black][font=Arial][size=10.5pt]);
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]//[/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]索引发布系统内部文件[/size][/font][/color]
[color=black][font=Arial][size=10.5pt] PreparedStatement pstm = conn.prepareStatement(
"select title,body,creationtime from document where creationtime > '" + fromdate +
"' order by creationtime");
ResultSet rs = pstm.executeQuery();
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]while[/size][/font][/color][color=black][font=Arial][size=10.5pt] (rs.next()) {
String creationtime = rs.getString("creationtime");
String title = rs.getString("title");
String body = rs.getString("body");
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt] (title == [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt] || body == [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt]) {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]continue[/size][/font][/color][color=black][font=Arial][size=10.5pt];
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
addDocsToIndex(title,body, creationtime,indexWriter);
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception ex) {
ex.printStackTrace();
}
}
indexWriter.optimize();
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception ex) {
ex.printStackTrace();
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]finally[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
indexWriter.close();
conn.close();
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception e) {
e.printStackTrace();
}
}
}
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]/**
* [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]检查索引文件是否存在[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]
* @param s
* @return [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]索引是否存在[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]
*/[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]private[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]boolean[/size][/font][/color][color=black][font=Arial][size=10.5pt] indexExists(String s) {
File file = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] File(s + File.separator + "segments");
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color][color=black][font=Arial][size=10.5pt] file.exists();
}
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]/**
* [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]增加一组索引[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]
* @param title
* @param body
* @param creationtime
* @param indexwriter
* @return
*/[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]private[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]final[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]void[/size][/font][/color][color=black][font=Arial][size=10.5pt] addNewsToIndex(String docid, String url,String title, String body,
String ptime, IndexWriter indexwriter) [/size][/font][/color][color=blue][font=Arial][size=10.5pt]throws[/size][/font][/color][color=black][font=Arial][size=10.5pt]
IOException {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt] (indexwriter == [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt]) {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color][color=black][font=Arial][size=10.5pt];
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]else[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
Document document = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] Document();
document.add(Field.Text("title", title));
document.add(Field.Text("body", body));
document.add([/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] Field("creationtime", creationtime, [/size][/font][/color][color=blue][font=Arial][size=10.5pt]true[/size][/font][/color][color=black][font=Arial][size=10.5pt], [/size][/font][/color][color=blue][font=Arial][size=10.5pt]true[/size][/font][/color][color=black][font=Arial][size=10.5pt], [/size][/font][/color][color=blue][font=Arial][size=10.5pt]false[/size][/font][/color][color=black][font=Arial][size=10.5pt]));
indexwriter.addDocument(document);
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception ex) {
ex.printStackTrace();
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color][color=black][font=Arial][size=10.5pt];
}
}
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]/**
* [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]取得[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]IndexWriter
* @param flag [/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]是否新建索引[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]
* @return IndexWriter
*/[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]private[/size][/font][/color][color=black][font=Arial][size=10.5pt] IndexWriter getWriter([/size][/font][/color][color=blue][font=Arial][size=10.5pt]boolean[/size][/font][/color][color=black][font=Arial][size=10.5pt] flag) [/size][/font][/color][color=blue][font=Arial][size=10.5pt]throws[/size][/font][/color][color=black][font=Arial][size=10.5pt] IOException {
String s = indexPath;
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt] (s == [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt]) {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]throw[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] IOException("[/size][/font][/color][color=black][font=宋体][size=10.5pt]索引文件路径设置错误[/size][/font][/color][color=black][font=Arial][size=10.5pt].");
}
indexPath = s + File.separator + "search";
IndexWriter indexwriter = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt];
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt] (flag) {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
indexwriter = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] IndexWriter(indexPath, analyzer, [/size][/font][/color][color=blue][font=Arial][size=10.5pt]true[/size][/font][/color][color=black][font=Arial][size=10.5pt]);
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception exception) {
System.err.println("ERROR: Failed to create a [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] index writer.");
exception.printStackTrace();
}
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]else[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt] (indexExists(indexPath)) {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
indexwriter = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] IndexWriter(indexPath, analyzer, [/size][/font][/color][color=blue][font=Arial][size=10.5pt]false[/size][/font][/color][color=black][font=Arial][size=10.5pt]);
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception exception1) {
System.err.println("ERROR: Failed to open an index writer.");
exception1.printStackTrace();
}
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]else[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]try[/size][/font][/color][color=black][font=Arial][size=10.5pt] {
indexwriter = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] IndexWriter(indexPath, analyzer, [/size][/font][/color][color=blue][font=Arial][size=10.5pt]true[/size][/font][/color][color=black][font=Arial][size=10.5pt]);
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]catch[/size][/font][/color][color=black][font=Arial][size=10.5pt] (Exception exception2) {
System.err.println("ERROR: Failed to create a [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] index writer.");
exception2.printStackTrace();
}
}
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]return[/size][/font][/color][color=black][font=Arial][size=10.5pt] indexwriter;
}
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]public[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]static[/size][/font][/color]
[color=blue][font=Arial][size=10.5pt]void[/size][/font][/color][color=black][font=Arial][size=10.5pt] main(String[] args) {
String lastUpdate = "/home/lucenetest/lastUpdate.txt";
SearchIndexer searchIndexer = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] SearchIndexer("/home/lucenetest/index");
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]//[/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]取出上次更新时间[/size][/font][/color]
[color=black][font=Arial][size=10.5pt] String str = Util.readTxtFile(lastUpdate);
[/size][/font][/color][color=blue][font=Arial][size=10.5pt]if[/size][/font][/color][color=black][font=Arial][size=10.5pt](str==[/size][/font][/color][color=blue][font=Arial][size=10.5pt]null[/size][/font][/color][color=black][font=Arial][size=10.5pt] || str.length()==0){
str = [/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] java.util.Date().toString();
}
searchIndexer.updateIndex(str);
[/size][/font][/color][color=#00aa00][font=Arial][size=10.5pt]//[/size][/font][/color][color=#00aa00][font=宋体][size=10.5pt]写入当前时间[/size][/font][/color]
[color=black][font=Arial][size=10.5pt] Util.writeTxtFile(lastUpdate,[/size][/font][/color][color=blue][font=Arial][size=10.5pt]new[/size][/font][/color][color=black][font=Arial][size=10.5pt] java.util.Date(),[/size][/font][/color][color=blue][font=Arial][size=10.5pt]false[/size][/font][/color][color=black][font=Arial][size=10.5pt]);
}
}[/size][/font][/color][/align][/align][align=left][align=left][color=black][font=宋体][size=10.5pt]写个[/size][/font][/color][color=black][font=Arial][size=10.5pt]cmd[/size][/font][/color][color=black][font=宋体][size=10.5pt]或者[/size][/font][/color][color=black][font=Arial][size=10.5pt]sh[/size][/font][/color][color=black][font=宋体][size=10.5pt]在相应操作系统下面定时执行[/size][/font][/color][color=black][font=Arial][size=10.5pt]SearchIndexer[/size][/font][/color][color=black][font=宋体][size=10.5pt]就可以了。[/size][/font][/color][color=black][font=Arial][size=10.5pt][/size][/font][/color][/align][/align]
optimistic 2007-10-1 11:01
:\ :\ :\ :\ budong
optimistic 2007-10-1 11:02
可以直接执行:lol:
wufx05 2007-11-4 13:01
我不会 我不大懂
JAVA难不
我们就会个C后就开始学数据结构