1.在oracle客戶端中按照如下路徑找到tnsnames.ora文件,并以文本格式打開
D:\oracle\ora92\network\admin\tnsnames.ora
2.在打開的文本中加入以下內(nèi)容
LSD_192.168.1.32 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(
HOST = 192.168.1.32)(PORT = 1521))
)
(CONNECT_DATA =
(
SID = ora9i)
(SERVER = DEDICATED)
)
)
3.打開oracle客戶端,進行連接服務(wù)器的操作
此時可以發(fā)現(xiàn)在"數(shù)據(jù)庫"選項中多出了"LSD_192.168.1.32"這條記錄,
如果選擇該項,就可以連接到ip為192.168.1.32的服務(wù)器上
數(shù)據(jù)庫的SID為 ora9i.
lucene默認根據(jù)匹配度對搜索結(jié)果降序排,如果對某個域進行排序?
通常分兩步:
step1)建索引時
doc.add(new Field("audittime", row.get("audittime").toString(),
Field.Store.NO, Field.Index.UN_TOKENIZED));
關(guān)鍵點是你需要排序的字段建索引時應(yīng)該采用Field.Index.UN_TOKENIZED,至于需不需要Field.Store.NO看實際情況,反正不影響排序
step2)搜索時
public Hits search(SearchVO searchVO) throws IOException {
................
Sort sort = this.buildSort(searchVO);
Hits hits = searcher.search(query, sort);
return hits;
}
private Sort buildSort(SearchVO searchVO) {
if (searchVO.getOrderby() == null || searchVO.getOrderby().length() < 1) {
return null;
}
Sort sort = new Sort(searchVO.getOrderby(),
(searchVO.getAscflag() == 1 ? false : true));
return sort;
}
關(guān)鍵點是通過建立一個Sort實例然后傳給IndexSearcher 的另一個重載方法search(Query query,Sort sort);
通過Sort你可以指定排序字段名,升序降序.
如果你需要特指字段類型,你需要使用 new Sort(SortField field)
或者你需要通過多字段排序,你需要使用 new Sort(SortField[] fields)
我就不再贅述了
題外話:
使用lucene 排序是很簡單的,但如何發(fā)揮它的效果是一個值得思考的地方.
如果你是實時的更新lucene索引我沒話說(這需要相當謹慎的設(shè)計).
如果你定時更新索引,就會有些問題,比如你要排序的字段更新速度很快,你應(yīng)該如何顯示它? 因為你排序的數(shù)據(jù)(即建索引時的數(shù)據(jù))和當前的數(shù)據(jù)并不完全同步,這會給顯示帶來問題.如果你顯示建索引時的數(shù)據(jù),這樣排序本身沒問題,但客戶會很奇怪我的數(shù)據(jù)明明是6了怎么還顯示4.如果你顯示當前的數(shù)據(jù)就更奇怪了,客戶可能會奇怪我的數(shù)據(jù)是1000怎么排名第4,排名第一的才500? 如果你的數(shù)據(jù)更新緩慢,這樣做不會有什么問題.但更新很快的話就是災(zāi)難了.
Lucene 是一個基于 Java 的全文檢索工具包,你可以利用它來為你的應(yīng)用程序加入索引和檢索功能。Lucene 目前是著名的 Apache Jakarta 家族中的一個開源項目,下面我們即將學(xué)習(xí) Lucene 的索引機制以及它的索引文件的結(jié)構(gòu)。
在這篇文章中,我們首先演示如何使用 Lucene 來索引文檔,接著討論如何提高索引的性能。最后我們來分析 Lucene 的索引文件結(jié)構(gòu)。需要記住的是,Lucene 不是一個完整的應(yīng)用程序,而是一個信息檢索包,它方便你為你的應(yīng)用程序添加索引和搜索功能。
架構(gòu)概覽
圖一顯示了 Lucene 的索引機制的架構(gòu)。Lucene 使用各種解析器對各種不同類型的文檔進行解析。比如對于 HTML 文檔,HTML 解析器會做一些預(yù)處理的工作,比如過濾文檔中的 HTML 標簽等等。HTML 解析器的輸出的是文本內(nèi)容,接著 Lucene 的分詞器(Analyzer)從文本內(nèi)容中提取出索引項以及相關(guān)信息,比如索引項的出現(xiàn)頻率。接著 Lucene 的分詞器把這些信息寫到索引文件中。
圖一:Lucene 索引機制架構(gòu)
用Lucene索引文檔
接下來我將一步一步的來演示如何利用 Lucene 為你的文檔創(chuàng)建索引。只要你能將要索引的文件轉(zhuǎn)化成文本格式,Lucene 就能為你的文檔建立索引。比如,如果你想為 HTML 文檔或者 PDF 文檔建立索引,那么首先你就需要從這些文檔中提取出文本信息,然后把文本信息交給 Lucene 建立索引。我們接下來的例子用來演示如何利用 Lucene 為后綴名為 txt 的文件建立索引。
1. 準備文本文件
首先把一些以 txt 為后綴名的文本文件放到一個目錄中,比如在 Windows 平臺上,你可以放到 C:\\files_to_index 下面。
2. 創(chuàng)建索引
清單1是為我們所準備的文檔創(chuàng)建索引的代碼。
清單1:用 Lucene 索引你的文檔
package lucene.index;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
/**
* This class demonstrates the process of creating an index with Lucene
* for text files in a directory.
*/
public class TextFileIndexer {
public static void main(String[] args) throws Exception{
//fileDir is the directory that contains the text files to be indexed
File fileDir = new File("C:\\files_to_index ");
//indexDir is the directory that hosts Lucene's index files
File indexDir = new File("C:\\luceneIndex");
Analyzer luceneAnalyzer = new StandardAnalyzer();
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
File[] textFiles = fileDir.listFiles();
long startTime = new Date().getTime();
//Add documents to the index
for(int i = 0; i < textFiles.length; i++){
if(textFiles[i].isFile() && textFiles[i].getName().endsWith(".txt")){
System.out.println("File " + textFiles[i].getCanonicalPath()
+ " is being indexed");
Reader textReader = new FileReader(textFiles[i]);
Document document = new Document();
document.add(Field.Text("content",textReader));
document.add(Field.Text("path",textFiles[i].getPath()));
indexWriter.addDocument(document);
}
}
indexWriter.optimize();
indexWriter.close();
long endTime = new Date().getTime();
System.out.println("It took " + (endTime - startTime)
+ " milliseconds to create an index for the files in the directory "
+ fileDir.getPath());
}
}
|
正如清單1所示,你可以利用 Lucene 非常方便的為文檔創(chuàng)建索引。接下來我們分析一下清單1中的比較關(guān)鍵的代碼,我們先從下面的一條語句開始看起。
Analyzer luceneAnalyzer = new StandardAnalyzer();
|
這條語句創(chuàng)建了類 StandardAnalyzer 的一個實例,這個類是用來從文本中提取出索引項的。它只是抽象類 Analyzer 的其中一個實現(xiàn)。Analyzer 也有一些其它的子類,比如 SimpleAnalyzer 等。
我們接著看另外一條語句:
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
|
這條語句創(chuàng)建了類 IndexWriter 的一個實例,該類也是 Lucene 索引機制里面的一個關(guān)鍵類。這個類能創(chuàng)建一個新的索引或者打開一個已存在的索引并為該索引添加文檔。我們注意到該類的構(gòu)造函數(shù)接受三個參數(shù),第一個參數(shù)指定了存儲索引文件的路徑。第二個參數(shù)指定了在索引過程中使用什么樣的分詞器。最后一個參數(shù)是個布爾變量,如果值為真,那么就表示要創(chuàng)建一個新的索引,如果值為假,就表示打開一個已經(jīng)存在的索引。
接下來的代碼演示了如何添加一個文檔到索引文件中。
Document document = new Document();
document.add(Field.Text("content",textReader));
document.add(Field.Text("path",textFiles[i].getPath()));
indexWriter.addDocument(document);
|
首先第一行創(chuàng)建了類 Document 的一個實例,它由一個或者多個的域(Field)組成。你可以把這個類想象成代表了一個實際的文檔,比如一個 HTML 頁面,一個 PDF 文檔,或者一個文本文件。而類 Document 中的域一般就是實際文檔的一些屬性。比如對于一個 HTML 頁面,它的域可能包括標題,內(nèi)容,URL 等。我們可以用不同類型的 Field 來控制文檔的哪些內(nèi)容應(yīng)該索引,哪些內(nèi)容應(yīng)該存儲。如果想獲取更多的關(guān)于 Lucene 的域的信息,可以參考 Lucene 的幫助文檔。代碼的第二行和第三行為文檔添加了兩個域,每個域包含兩個屬性,分別是域的名字和域的內(nèi)容。在我們的例子中兩個域的名字分別是 "content"和"path"。分別存儲了我們需要索引的文本文件的內(nèi)容和路徑。最后一行把準備好的文檔添加到了索引當中。
當我們把文檔添加到索引中后,不要忘記關(guān)閉索引,這樣才保證 Lucene 把添加的文檔寫回到硬盤上。下面的一句代碼演示了如何關(guān)閉索引。
利用清單1中的代碼,你就可以成功的將文本文檔添加到索引中去。接下來我們看看對索引進行的另外一種重要的操作,從索引中刪除文檔。
從索引中刪除文檔
類IndexReader負責從一個已經(jīng)存在的索引中刪除文檔,如清單2所示。
清單2:從索引中刪除文檔
File indexDir = new File("C:\\luceneIndex");
IndexReader ir = IndexReader.open(indexDir);
ir.delete(1);
ir.delete(new Term("path","C:\\file_to_index\lucene.txt"));
ir.close();
|
在清單2中,第二行用靜態(tài)方法 IndexReader.open(indexDir) 初始化了類 IndexReader 的一個實例,這個方法的參數(shù)指定了索引的存儲路徑。類 IndexReader 提供了兩種方法去刪除一個文檔,如程序中的第三行和第四行所示。第三行利用文檔的編號來刪除文檔。每個文檔都有一個系統(tǒng)自動生成的編號。第四行刪除了路徑為"C:\\file_to_index\lucene.txt"的文檔。你可以通過指定文件路徑來方便的刪除一個文檔。值得注意的是雖然利用上述代碼刪除文檔使得該文檔不能被檢索到,但是并沒有物理上刪除該文檔。Lucene 只是通過一個后綴名為 .delete 的文件來標記哪些文檔已經(jīng)被刪除。既然沒有物理上刪除,我們可以方便的把這些標記為刪除的文檔恢復(fù)過來,如清單 3 所示,首先打開一個索引,然后調(diào)用方法 ir.undeleteAll() 來完成恢復(fù)工作。
清單3:恢復(fù)已刪除文檔
File indexDir = new File("C:\\luceneIndex");
IndexReader ir = IndexReader.open(indexDir);
ir.undeleteAll();
ir.close();
|
你現(xiàn)在也許想知道如何物理上刪除索引中的文檔,方法也非常簡單。清單 4 演示了這個過程。
清單4:如何物理上刪除文檔
File indexDir = new File("C:\\luceneIndex");
Analyzer luceneAnalyzer = new StandardAnalyzer();
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,false);
indexWriter.optimize();
indexWriter.close();
|
在清單 4 中,第三行創(chuàng)建了類 IndexWriter 的一個實例,并且打開了一個已經(jīng)存在的索引。第 4 行對索引進行清理,清理過程中將把所有標記為刪除的文檔物理刪除。
Lucene 沒有直接提供方法對文檔進行更新,如果你需要更新一個文檔,那么你首先需要把這個文檔從索引中刪除,然后把新版本的文檔加入到索引中去。
提高索引性能
利用 Lucene,在創(chuàng)建索引的工程中你可以充分利用機器的硬件資源來提高索引的效率。當你需要索引大量的文件時,你會注意到索引過程的瓶頸是在往磁盤上寫索引文件的過程中。為了解決這個問題, Lucene 在內(nèi)存中持有一塊緩沖區(qū)。但我們?nèi)绾慰刂?Lucene 的緩沖區(qū)呢?幸運的是,Lucene 的類 IndexWriter 提供了三個參數(shù)用來調(diào)整緩沖區(qū)的大小以及往磁盤上寫索引文件的頻率。
1.合并因子(mergeFactor)
這個參數(shù)決定了在 Lucene 的一個索引塊中可以存放多少文檔以及把磁盤上的索引塊合并成一個大的索引塊的頻率。比如,如果合并因子的值是 10,那么當內(nèi)存中的文檔數(shù)達到 10 的時候所有的文檔都必須寫到磁盤上的一個新的索引塊中。并且,如果磁盤上的索引塊的隔數(shù)達到 10 的話,這 10 個索引塊會被合并成一個新的索引塊。這個參數(shù)的默認值是 10,如果需要索引的文檔數(shù)非常多的話這個值將是非常不合適的。對批處理的索引來講,為這個參數(shù)賦一個比較大的值會得到比較好的索引效果。
2.最小合并文檔數(shù)
這個參數(shù)也會影響索引的性能。它決定了內(nèi)存中的文檔數(shù)至少達到多少才能將它們寫回磁盤。這個參數(shù)的默認值是10,如果你有足夠的內(nèi)存,那么將這個值盡量設(shè)的比較大一些將會顯著的提高索引性能。
3.最大合并文檔數(shù)
這個參數(shù)決定了一個索引塊中的最大的文檔數(shù)。它的默認值是 Integer.MAX_VALUE,將這個參數(shù)設(shè)置為比較大的值可以提高索引效率和檢索速度,由于該參數(shù)的默認值是整型的最大值,所以我們一般不需要改動這個參數(shù)。
清單 5 列出了這個三個參數(shù)用法,清單 5 和清單 1 非常相似,除了清單 5 中會設(shè)置剛才提到的三個參數(shù)。
清單5:提高索引性能
/**
* This class demonstrates how to improve the indexing performance
* by adjusting the parameters provided by IndexWriter.
*/
public class AdvancedTextFileIndexer {
public static void main(String[] args) throws Exception{
//fileDir is the directory that contains the text files to be indexed
File fileDir = new File("C:\\files_to_index");
//indexDir is the directory that hosts Lucene's index files
File indexDir = new File("C:\\luceneIndex");
Analyzer luceneAnalyzer = new StandardAnalyzer();
File[] textFiles = fileDir.listFiles();
long startTime = new Date().getTime();
int mergeFactor = 10;
int minMergeDocs = 10;
int maxMergeDocs = Integer.MAX_VALUE;
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
indexWriter.mergeFactor = mergeFactor;
indexWriter.minMergeDocs = minMergeDocs;
indexWriter.maxMergeDocs = maxMergeDocs;
//Add documents to the index
for(int i = 0; i < textFiles.length; i++){
if(textFiles[i].isFile() && textFiles[i].getName().endsWith(".txt")){
Reader textReader = new FileReader(textFiles[i]);
Document document = new Document();
document.add(Field.Text("content",textReader));
document.add(Field.Keyword("path",textFiles[i].getPath()));
indexWriter.addDocument(document);
}
}
indexWriter.optimize();
indexWriter.close();
long endTime = new Date().getTime();
System.out.println("MergeFactor: " + indexWriter.mergeFactor);
System.out.println("MinMergeDocs: " + indexWriter.minMergeDocs);
System.out.println("MaxMergeDocs: " + indexWriter.maxMergeDocs);
System.out.println("Document number: " + textFiles.length);
System.out.println("Time consumed: " + (endTime - startTime) + " milliseconds");
}
}
|
通過這個例子,我們注意到在調(diào)整緩沖區(qū)的大小以及寫磁盤的頻率上面 Lucene 給我們提供了非常大的靈活性。現(xiàn)在我們來看一下代碼中的關(guān)鍵語句。如下的代碼首先創(chuàng)建了類 IndexWriter 的一個實例,然后對它的三個參數(shù)進行賦值。
int mergeFactor = 10;
int minMergeDocs = 10;
int maxMergeDocs = Integer.MAX_VALUE;
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
indexWriter.mergeFactor = mergeFactor;
indexWriter.minMergeDocs = minMergeDocs;
indexWriter.maxMergeDocs = maxMergeDocs;
|
下面我們來看一下這三個參數(shù)取不同的值對索引時間的影響,注意參數(shù)值的不同和索引之間的關(guān)系。我們?yōu)檫@個實驗準備了 10000 個測試文檔。表 1 顯示了測試結(jié)果。
表1:測試結(jié)果
通過表 1,你可以清楚地看到三個參數(shù)對索引時間的影響。在實踐中,你會經(jīng)常的改變合并因子和最小合并文檔數(shù)的值來提高索引性能。只要你有足夠大的內(nèi)存,你可以為合并因子和最小合并文檔數(shù)這兩個參數(shù)賦盡量大的值以提高索引效率,另外我們一般無需更改最大合并文檔數(shù)這個參數(shù)的值,因為系統(tǒng)已經(jīng)默認將它設(shè)置成了最大。
Lucene 索引文件結(jié)構(gòu)分析
在分析 Lucene 的索引文件結(jié)構(gòu)之前,我們先要理解反向索引(Inverted index)這個概念,反向索引是一種以索引項為中心來組織文檔的方式,每個索引項指向一個文檔序列,這個序列中的文檔都包含該索引項。相反,在正向索引中,文檔占據(jù)了中心的位置,每個文檔指向了一個它所包含的索引項的序列。你可以利用反向索引輕松的找到那些文檔包含了特定的索引項。Lucene正是使用了反向索引作為其基本的索引結(jié)構(gòu)。
索引文件的邏輯視圖
在Lucene 中有索引塊的概念,每個索引塊包含了一定數(shù)目的文檔。我們能夠?qū)为毜乃饕龎K進行檢索。圖 2 顯示了 Lucene 索引結(jié)構(gòu)的邏輯視圖。索引塊的個數(shù)由索引的文檔的總數(shù)以及每個索引塊所能包含的最大文檔數(shù)來決定。
圖2:索引文件的邏輯視圖
Lucene 中的關(guān)鍵索引文件
下面的部分將會分析Lucene中的主要的索引文件,可能分析有些索引文件的時候沒有包含文件的所有的字段,但不會影響到對索引文件的理解。
1.索引塊文件
這個文件包含了索引中的索引塊信息,這個文件包含了每個索引塊的名字以及大小等信息。表 2 顯示了這個文件的結(jié)構(gòu)信息。
表2:索引塊文件結(jié)構(gòu)
2.域信息文件
我們知道,索引中的文檔由一個或者多個域組成,這個文件包含了每個索引塊中的域的信息。表 3 顯示了這個文件的結(jié)構(gòu)。
表3:域信息文件結(jié)構(gòu)
3.索引項信息文件
這是索引文件里面最核心的一個文件,它存儲了所有的索引項的值以及相關(guān)信息,并且以索引項來排序。表 4 顯示了這個文件的結(jié)構(gòu)。
表4:索引項信息文件結(jié)構(gòu)
4.頻率文件
這個文件包含了包含索引項的文檔的列表,以及索引項在每個文檔中出現(xiàn)的頻率信息。如果Lucene在索引項信息文件中發(fā)現(xiàn)有索引項和搜索詞相匹配。那么 Lucene 就會在頻率文件中找有哪些文件包含了該索引項。表5顯示了這個文件的一個大致的結(jié)構(gòu),并沒有包含這個文件的所有字段。
表5:頻率文件的結(jié)構(gòu)
5.位置文件
這個文件包含了索引項在每個文檔中出現(xiàn)的位置信息,你可以利用這些信息來參與對索引結(jié)果的排序。表 6 顯示了這個文件的結(jié)構(gòu)
表6:位置文件的結(jié)構(gòu)
到目前為止我們介紹了 Lucene 中的主要的索引文件結(jié)構(gòu),希望能對你理解 Lucene 的物理的存儲結(jié)構(gòu)有所幫助。
總結(jié)
目前已經(jīng)有非常多的知名的組織正在使用 Lucene,比如,Lucene 為 Eclipse 的幫助系統(tǒng),麻省理工學(xué)院的 OpenCourseWare 提供了搜索功能。通過閱讀這篇文章,希望你能對 Lucene 的索引機制有所了解,并且你會發(fā)現(xiàn)利用 Lucene 創(chuàng)建索引是非常簡單的事情。
轉(zhuǎn)載于http://www.128kj.com/article/article5/lucene4.html
step1.安裝JDK。
step2.Java開發(fā)環(huán)境配置(略)
本文使用jdk1.5.0_06,安裝目錄為:C:\Java\jdk1.5.0_06。
step3.Tomcat安裝(略)
本文使用Tomcat 5.0,安裝目錄為:C:\Java\Tomcat 5.0。
step4.Lucene開發(fā)環(huán)境配置
1)解壓下載的lucene-1.4.zip,可以看到lucene-core-1.4.jar和lucene-demos-1.4.jar這兩個文件。本文解壓目錄為:C:\Java\lucene-1.4。
2)將lucene-core-1.4.jar和lucene-demos-1.4.jar文件所在路徑添加到classpath。
本文將C:\Java\lucene-1.4\lucene-core-1.4.jar;C:\Java\lucene-1.4\lucene-demos-1.4.jar添加到classpath中。
二、Lucene開發(fā)包中Demo調(diào)試
控制臺應(yīng)用程序
step1.建立索引
>java org.apache.lucene.demo.IndexFiles C:\Java\lucene-1.4\src
將對C:\Java\lucene-1.4\src下所有文件建立索引,同時,在當前命令行位置將生成“index”文件夾。
step2.執(zhí)行查詢
>java org.apache.lucene.demo.SearchFiles
將會出現(xiàn)“Query:”提示符,在其后輸入關(guān)鍵字,回車,即可得到查詢結(jié)果。
Web應(yīng)用程序
step1.將lucene-core-1.4.jar和lucene-demos-1.9.1.jar這兩個文件復(fù)制到C:\Java\Tomcat 5.0\common\lib
step2.解壓下載的lucene-1.4.zip,可以看到luceneweb.war文件。將該文件復(fù)制到C:\Java\Tomcat 5.0\webapps
step3.重啟Tomcat服務(wù)器。
step4.建立索引
>java org.apache.lucene.demo.IndexHTML -create -index D:\opt\lucene\index ..
step5.執(zhí)行查詢
http://localhost:8080/luceneweb
step6.如果上一步執(zhí)行失敗,報出無法找到index目錄的信息
修改/luceneweb/下的configuration.jsp文件,String indexLocation = "/opt/lucene/index";改為String indexLocation = "D:\\opt\lucene\\index";
在文本框中輸入關(guān)鍵字,執(zhí)行,即可得到查詢結(jié)果。
熱鍵篇: Template:Alt /修改處:窗口->喜好設(shè)定->工作臺->按鍵->編輯->內(nèi)容輔助。個人習(xí)慣:Shift SPACE(空白)。簡易說明:編輯程序代碼時,打sysout Template啟動鍵,就會自動出現(xiàn):System.out.println(); 。
設(shè)定Template的格式:窗口->喜好設(shè)定->Java->編輯器->模板。
程序代碼自動排版:Ctrl Shift F
修改處:窗口->喜好設(shè)定->工作臺->按鍵->程序代碼->格式。
個人習(xí)慣:Alt Z。
自動排版設(shè)定:窗口->喜好設(shè)定->Java->程序代碼格式制作程序。
樣式頁面->將插入tab(而非空格鍵)以內(nèi)縮,該選項取消勾選
,下面空格數(shù)目填4,這樣在自動編排時會以空格4作縮排。
快速執(zhí)行程序:Ctrl F11
個人習(xí)慣:ALT X
修改處:窗口->喜好設(shè)定->工作臺->按鍵->執(zhí)行->啟動前一次的啟動作業(yè)。
簡易說明:第一次執(zhí)行時,它會詢問您執(zhí)行模式,
設(shè)置好后,以后只要按這個熱鍵,它就會快速執(zhí)行。
<ALT Z(排版完)、ATL X(執(zhí)行)>..我覺得很順手^___^
自動匯入所需要的類別:Ctrl Shift O
簡易說明:
假設(shè)我們沒有Import任何類別時,當我們在程序里打入:
BufferedReader buf =
new BufferedReader(new InputStreamReader(System.in));
此時Eclipse會警示說沒有匯入類別,這時我們只要按下Ctrl Shift O
,它就會自動幫我們Import類別。
查看使用類別的原始碼:Ctrl 鼠標左鍵點擊
簡易說明:可以看到您所使用類別的原始碼。
將選取的文字批注起來:Ctrl /
簡易說明:Debug時很方便。
修改處:窗口->喜好設(shè)定->工作臺->按鍵->程序代碼->批注
視景切換:Ctrl F8
個人習(xí)慣:Alt S。
修改處:窗口->喜好設(shè)定->工作臺->按鍵->窗口->下一個視景。
簡易說明:可以方便我們快速切換編輯、除錯等視景。
密技篇:
一套Eclipse可同時切換,英文、繁體、簡體顯示:
1.首先要先安裝完中文化包。
2.在桌面的快捷方式后面加上參數(shù)即可,
英文-> -nl "zh_US"
繁體-> -nl "zh_TW"
簡體-> -nl "zh_CN"。
(其它語系以此類推)
像我2.1.2中文化后,我在我桌面的Eclipse快捷方式加入?yún)?shù)-n1 "zh_US"。
"C:\Program Files\eclipse\eclipse.exe" -n "zh_US"
接口就會變回英文語系嚕。
利用Eclipse,在Word編輯文書時可不必將程序代碼重新編排:
將Eclipse程序編輯區(qū)的程序代碼整個復(fù)制下來(Ctrl C),直接貼(Ctrl V)到
Word或WordPad上,您將會發(fā)現(xiàn)在Word里的程序代碼格式,跟Eclipse
所設(shè)定的完全一樣,包括字型、縮排、關(guān)鍵詞顏色。我曾試過JBuilder
、GEL、NetBeans...使用復(fù)制貼上時,只有縮排格式一樣,字型、顏
色等都不會改變。
外掛篇:
外掛安裝:將外掛包下載回來后,將其解壓縮后,您會發(fā)現(xiàn)features、
plugins這2個數(shù)據(jù)夾,將里面的東西都復(fù)制或移動到Eclipse的features
、plugins數(shù)據(jù)夾內(nèi)后,重新啟動Eclipse即可。
讓Eclipse可以像JBuilderX一樣使用拖拉方式建構(gòu)GUI的外掛:
1.Jigloo SWT/Swing GUI Builder :
http://cloudgarden.com/jigloo/index.html
下載此版本:Jigloo plugin for Eclipse (using Java 1.4 or 1.5)
安裝后即可由檔案->新建->其它->GUI Form選取要建構(gòu)的GUI類型。
2.Eclipse Visual Editor Project:
http://www.eclipse.org/vep/
點選下方Download Page,再點選Latest Release 0.5.0進入下載。
除了VE-runtime-0.5.0.zip要下載外,以下這2個也要:
EMF build 1.1.1: (build page) (download zip)
GEF Build 2.1.2: (build page) (download zip)
3.0 M8版本,請下載:
EMF build I200403250631
GEF Build I20040330
VE-runtime-1.0M1
安裝成功后,便可由File->New->Visual Class開始UI設(shè)計。
安裝成功后,即可由新建->Java->AWT與Swing里選擇
所要建構(gòu)的GUI類型開始進行設(shè)計。VE必須配合著對應(yīng)
版本,才能正常使用,否則即使安裝成功,使用上仍會
有問題。
使用Eclipse來開發(fā)JSP程序:
外掛名稱:lomboz(下載頁面)
http://forge.objectweb.org/project/showfiles.php?group_id=97
請選擇適合自己版本的lomboz下載,lomboz.212.p1.zip表示2.1.2版,
lomboz.3m7.zip表示M7版本....以此類推。
lomboz安裝以及設(shè)置教學(xué):
Eclipse開發(fā)JSP-教學(xué)文件
Java 轉(zhuǎn)exe篇:
實現(xiàn)方式:Eclipse搭配JSmooth(免費)。
1.先由Eclipse制作包含Manifest的JAR。
制作教學(xué)
2.使用JSmooth將做好的JAR包裝成EXE。
JSmooth下載頁面:
http://jsmooth.sourceforge.net/index.php
3.制作完成的exe文件,可在有裝置JRE的Windows上執(zhí)行。
Eclipse-Java 編輯器最佳設(shè)定:
編輯器字型設(shè)定:工作臺->字型->Java編輯器文字字型。
(建議設(shè)定Courier New -regular 10)
編輯器相關(guān)設(shè)定:窗口->喜好設(shè)定->Java->編輯器
外觀:顯示行號、強調(diào)對稱顯示的方括號、強調(diào)顯示現(xiàn)行行、
顯示打印邊距,將其勾選,Tab寬度設(shè)4,打印編距字段設(shè)80。
程序代碼協(xié)助:采預(yù)設(shè)即可。
語法:可設(shè)定關(guān)鍵詞、字符串等等的顯示顏色。
附注:采預(yù)設(shè)即可。
輸入:全部字段都勾選。
浮動說明:采預(yù)設(shè)即可。
導(dǎo)覽:采預(yù)設(shè)即可。
使自動排版排出來的效果,最符合Java設(shè)計慣例的設(shè)定:
自動排版設(shè)定:窗口->喜好設(shè)定->Java->程序代碼制作格式。
換行:全部不勾選。
分行:行長度上限設(shè):80。
樣式:只將強制轉(zhuǎn)型后插入空白勾選。
內(nèi)縮空格數(shù)目:設(shè)為4。
Eclipse 的教學(xué)文件:
Eclipse 3.0系列熱鍵表 - 中英對照解說版 (by sungo) ~New~
Window GCC CDT用Eclipse開發(fā)C、C (by sungo) ~New~
其它:
擴充Eclipse的Java 開發(fā)工具(中文)
使用Eclipse開發(fā)J2EE 應(yīng)用程序(中文)
使用Eclipse平臺進行除錯(中文)
用Eclipse進行XML 開發(fā)(中文)
開發(fā)Eclipse外掛程序(中文)
國際化您的Eclipse外掛程序(英文)
將Swing編輯器加入Eclipse(英文)
如何測試你的Eclipse plug-in符合國際市場需求(英文)
Eclipse 的相關(guān)網(wǎng)站:
http://eclipse-plugins.2y.net/eclipse/index.jsp
http://www.eclipseplugincentral.com/
http://www.okjava.net.cn
lucene是apache的一個開源項目,一個開放源代碼的全文檢索引擎工具包。今天初學(xué)了一下。
1. 首先下載最新版的lucene
http://apache.mirror.phpchina.com/lucene/java/lucene-2.2.0.zip
2. 解壓下載的包,會看到兩個jar文件。打開eclipse,新建個工程,在該工程處點右鍵,選擇properties,在 Libraries項中導(dǎo)入那兩個jar文件。
3. 找到IndexFiles.class,雙擊打開,如圖:

再點擊菜單欄上的run,選擇open run dialog, 在arguments項填入 lucene解壓的目錄/src

運行,就可以看到一些搜索結(jié)果了
4. 再選擇SearchFiles.class,運行,有可能需要open run dialog中改一下設(shè)置,然后程序會讓我們輸入搜索詞,輸入即可。
今天僅僅初步了解了一下lucene,最近一直都會跟進,感覺lucene還是比較有意思的,也比較實用。
轉(zhuǎn)載于http://hi.baidu.com/homefovever/blog/item/94121e3da42396ed3c6d97c5.html
1.在網(wǎng)上下載了lucene 2.2版,http://jakarta.apache.org/Lucene/
2.然后分別安裝了jdk1.6和tomcat5.5
3.建一個目錄d:\lucenetest\index,在里面放一些文本文件和網(wǎng)頁文件
4.進入dos模式,輸入命令:java org.apache.lucene.demo.IndexFiles d:\lucenetest\index
如:c:\>java org.apache.lucene.demo.IndexFiles d:\lucenetest\index 按回車,
這時會索引d:\lucenetest\index目錄下的所有文件,包括子目錄中的文件,并將索引文件寫入:c:\index目錄中
(自動創(chuàng)建的,根據(jù)你的dos符起始路徑,將在其下建index目錄)。
輸入命令:java org.apache.lucene.demo.SearchFiles
如:c:\>java org.apache.lucene.demo.SearchFiles 回車
5. Query:在這里輸入檢索內(nèi)容
環(huán)境變量還是附上
CLASSPATH :.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\lucene-core-2.0.0.jar;%JAVA_HOME%\lib\lucene-demos-2.0.0.jar
JAVA_HOME C:\Program Files\Java\jdk1.6
path 加上 %JAVA_HOME%\bin
6.lucene 安裝中可能會出現(xiàn)很多問題,與你jdk 1.6的安裝和TOMCAT的安裝有一定的關(guān)系。
http://searcher.org.cn/html/lucene/20070921/212.html
不少論壇或個人都推出了Ghost版系統(tǒng),裝機超簡單,節(jié)省時間,在網(wǎng)管和裝機商等人群中流傳極廣,只要用Ghost“恢復(fù)”一下,軟件、驅(qū)動、補丁就全了,這其中最著名的應(yīng)該就是“番茄花園”了。
正是為了照顧通用性和集成的驅(qū)動,這類Ghost版通常不太穩(wěn)定,而且有很多都開始集成流氓插件!
1.首先,店主給裝的是豬豬貓的電腦城裝機版(具體是哪一版就幾不得了,因為還沒有堅持3天),一看里面就有插件!而且集成的軟件太多了!可能是為了電腦城的人裝機方便吧!說實話那系統(tǒng)速度一般!穩(wěn)定性也一般般!
不久還下載了豬豬貓的2003(當然不如xp用的爽了啊)很快就下崗了!感覺就是不適合我們用!接著上崗的是筆記本專用版!速度到還是可以的,就是那碩大的字體怎么看怎么就不爽!在豬豬貓論壇里看了好多版本都是那樣的,就再也不看了!
2.下面說說xunchi,相對來說xunchi還是相當不錯的。gohst最佳優(yōu)化版,速度很快,穩(wěn)定性也強!不足之處是不支持USB,另外在“我的電腦”里面有個“打印機” 看這有點礙眼!XUNCHI IE7&MEDIA PLAY 11這個嘛,相傳還是相當不錯的!不過很可惜我沒有裝上,因為裝的時候忘了把視頻拔下來,結(jié)果藍屏了(深度的5.2也是這樣的)!建議大家以后裝的時候注意咯!
3.諾德爾網(wǎng)吧系統(tǒng)(nodeer)這個速度是其他系統(tǒng)比不了的啊!裝好了之后PF值才36!!256的內(nèi)存玩CS一點都不卡!精簡了不少的組件,當然穩(wěn)定性還行咯!!安全就相對遜色了許多了啊!因為不能打補丁!一打就藍屏!用這個的人也要注意咯!諾德爾snow新春正式版,這個就不如前一個
版本咯!速度相對前一個慢了一些!其他沒有什么區(qū)別了,就是集成了驅(qū)動,比較方便!(似乎還有病毒,用他的時候中了威金,結(jié)果把全盤都格了!)網(wǎng)吧系統(tǒng),大家慎重選擇!玩游戲追求速度的人首選!
4.番茄花園,是拿同學(xué)的安裝盤裝的。美化自動安裝的那種!里面的流氓插件不敢恭維。相信大家都知道咯!不過速度和穩(wěn)定性還好啊!有點能耐的人把不想要的都除掉,相信還是一個很漂亮很好用的系統(tǒng)啊!
5.龍帝國。都說他是ghost的鼻祖!確實名副其實啊!穩(wěn)定,沒有插件,有速度而且安全!代表那就多咯!fxzm大俠的0425,1008都用過,而且刻盤收藏!至今還是廣為流傳的啊!另外就是西門的了!用的就是(電腦公司版)7.0版。當然還是繼承了龍帝國的傳統(tǒng)咯!也有很多有特色的地方!裝完之后,可以刪除驅(qū)動,除去殘余病毒和熊貓!
另外特別爽的就是開機集成的“超級急救工具箱”了!里面東西多了去了!ghost一鍵還原,老毛挑E,PE工具箱,dos.......相當適用啊!!不過有點小問題,OFFICE組件ppt有點問題,畫筆用不了!另外我同學(xué)在考試系統(tǒng)里面做ppt都不評分!當然也不是每個人都用ppt的啦,小問題咯!還有就是風(fēng)之客的5.0了!個人覺得這個也是相當不錯的!不僅美觀(喜歡里面的主題,壁紙),而且速度也不錯!驅(qū)動是相當?shù)凝R全!誰說fxzm退隱了龍帝國就后繼無人了!江山代有人才出啊!
6.雨林木風(fēng)。也是相當有特色的啊!都說他的后起之秀!果不其然啊!干凈!速度!純凈!1.8!3.0!3.1都是代表咯!最初的1.8,有時會彈出內(nèi)存不能為read,不能為written,讓人郁悶啊!到了3.0和3.1就好多了啊 !確實進步不小!刻了盤幫同學(xué)裝了十幾臺,用的都不錯!現(xiàn)在的雨林木風(fēng)正在成長!相信會有更多好東西誕生!
7.系統(tǒng)之家。裝過紀念版!其實速度一般,穩(wěn)定性相對好!驅(qū)動也全!其實也是因人而異,我覺得一般!很多人用的也很好!畢竟是系統(tǒng)之家的力作啊!
8.xp原版(上海市政府) 當然是沒有話說了!裝上驅(qū)動之后PF值110多!很多系統(tǒng)都是以他為藍本的!
總結(jié)一下吧!!
當然下載的遠不止這些了,可惜的是還有很多好的系統(tǒng)沒有測試,至今還有贏政的技術(shù)人員穩(wěn)定版和OFFICE2007版!東海5.0,7.3!龍卷風(fēng)1.0, 2.7!霏凡會員1.0都還在盤里閑著呢!
在買了電腦后短短的三個月里就下了這么多系統(tǒng),裝了這么多系統(tǒng),漸漸的也沒有換系統(tǒng)的興趣了,但是卻有了裝系統(tǒng)的經(jīng)驗了!幫不少的同學(xué)裝了系統(tǒng)!也幫他們解決了不少系統(tǒng)方面的問題!相信對你們也有一點幫助吧!
說到底,系統(tǒng)xp到底只有一個。ghost再多也是別人的,也是大眾化的。重要的是個性化,符合自己的使用習(xí)慣才是最重要的。精簡,優(yōu)化.....最終都是為個性化服務(wù)的!真正最好的系統(tǒng)其實在你們自己的手里!
Lucene開發(fā)環(huán)境配置;Lucene開發(fā)包中Demo調(diào)試。
一、Lucene開發(fā)環(huán)境配置
step1.Lucene開發(fā)包下載
下載地址1:http://mirror.vmmatrix.net/apache/lucene/java/
下載地址2:http://apache.justdn.org/lucene/java/
從中選擇合適的版本,本文使用lucene-1.9.1.zip。
step2.Java開發(fā)環(huán)境配置(略)
本文使用jdk1.5.0_06,安裝目錄為:C:\Java\jdk1.5.0_06。
step3.Tomcat安裝(略)
本文使用Tomcat 5.0,安裝目錄為:C:\Java\Tomcat 5.0。
step4.Lucene開發(fā)環(huán)境配置
1)解壓下載的lucene-1.9.1.zip,可以看到lucene-core-1.9.1.jar和lucene-demos-1.9.1.jar這兩個文件。本文解壓目錄為:C:\Java\lucene-1.9.1。
2)將lucene-core-1.9.1.jar和lucene-demos-1.9.1.jar文件所在路徑添加到classpath。
本文將C:\Java\lucene-1.9.1\lucene-core-1.9.1.jar;C:\Java\lucene-1.9.1\lucene-demos-1.9.1.jar添加到classpath中。
二、Lucene開發(fā)包中Demo調(diào)試
控制臺應(yīng)用程序
step1.建立索引
>java org.apache.lucene.demo.IndexFiles C:\Java\lucene-1.9.1\src
將對C:\Java\lucene-1.9.1\src下所有文件建立索引,同時,在當前命令行位置將生成“index”文件夾。
step2.執(zhí)行查詢
>java org.apache.lucene.demo.SearchFiles
將會出現(xiàn)“Query:”提示符,在其后輸入關(guān)鍵字,回車,即可得到查詢結(jié)果。
Web應(yīng)用程序
step1.將lucene-core-1.9.1.jar和lucene-demos-1.9.1.jar這兩個文件復(fù)制到C:\Java\Tomcat 5.0\common\lib
step2.解壓下載的lucene-1.9.1.zip,可以看到luceneweb.war文件。將該文件復(fù)制到C:\Java\Tomcat 5.0\webapps
step3.重啟Tomcat服務(wù)器。
step4.建立索引
>java org.apache.lucene.demo.IndexHTML -create -index D:\opt\lucene\index ..
step5.執(zhí)行查詢
http://localhost:8080/luceneweb
在文本框中輸入關(guān)鍵字,執(zhí)行,即可得到查詢結(jié)果。
參考資料:http://lucene.apache.org/java/docs/gettingstarted.html
JDom是不錯的API,算得上簡單高效,最重要是已經(jīng)成為jcp的一部分,這個咱得弄弄。不過www.jdom.org上寫文檔的人實在太懶,文檔出奇的少,流傳得最廣的恐怕是IBM上面的一篇《JDom讓java XML變得容易》,不過這篇文章只涉及基本的讀寫操作,遠不能勝任實際工作。花了兩天時間,把JDom的基本操作整理出來了,涵蓋了大部分的操作:元素、屬性、命名空間、PI、DTD、Schema,應(yīng)付一般的應(yīng)用沒什么問題。反正我沒有在網(wǎng)上見到更加詳盡的版本,你見過的話,請留下連接。暫時來不及編寫詳細的說明,先帖幾段程序,對有經(jīng)驗的Java開發(fā)者來說,已經(jīng)足夠了。程序都已經(jīng)經(jīng)過了實際的測試,我使用的JDom是0.9版。

1、創(chuàng)建XML文檔:


package org.bromon.jdom.example;
import java.io.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class CreateXML


{
public void Create()


{
try


{
Document doc = new Document();
ProcessingInstruction pi=new ProcessingInstruction("xml-stylesheet","type="textxsl" href="test.xsl"");
doc.addContent(pi);

Namespace ns = Namespace.getNamespace("http://www.bromon.org" );
Namespace ns2 = Namespace.getNamespace("other", "http://www.w3c.org" );

Element root = new Element("根元素", ns);
root.addNamespaceDeclaration(ns2);
doc.setRootElement(root);
Element el1 = new Element("元素一");
el1.setAttribute("屬性", "屬性一");

Text text1=new Text("元素值");
Element em = new Element("元素二").addContent("第二個元素");

el1.addContent(text1);
el1.addContent(em);

Element el2 = new Element("元素三").addContent("第三個元素");

root.addContent(el1);
root.addContent(el2);

//縮進四個空格,自動換行,gb2312編碼
XMLOutputter outputter = new XMLOutputter(" ", true,"GB2312");
outputter.output(doc, new FileWriter("test.xml"));
}catch(Exception e)


{
System.out.println(e);
}
}

public static void main(String args[])


{
new CreateXML().Create();
}

}

2、DTD驗證的:


package org.bromon.jdom.example;
import java.io.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class XMLWithDTD


{
public void validate()


{
try


{
SAXBuilder builder = new SAXBuilder(true);
builder.setFeature("http://xml.org/sax/features/validation";,true);
Document doc = builder.build(new FileReader("author.xml"));

System.out.println("搞掂");
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
}catch(Exception e)


{
System.out.println(e);
}

}
public static void main(String args[])


{
new XMLWithDTD().validate();
}

}

需要說明的是,這個程序沒有指明使用哪個DTD文件。DTD文件的位置是在XML中指定的,而且DTD不支持命名空間,一個XML只能引用一個DTD,所以程序直接讀取XML中指定的DTD,程序本身不用指定。不過這樣一來,好象就只能使用外部式的DTD引用方式了?高人指點。

3、XML Schema驗證的:


package org.bromon.jdom.example;
import java.io.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

public class XMLWithSchema


{
String xml="test.xml";
String schema="test-schema.xml";
public void validate()


{
try


{
SAXBuilder builder = new SAXBuilder(true);
//指定約束方式為XML schema
builder.setFeature("http://apache.org/xml/features/validation/schema";, true);
//導(dǎo)入schema文件
builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema);
Document doc = builder.build(new FileReader(xml));

System.out.println("搞掂");
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
}catch(Exception e)


{
System.out.println("驗證失敗:"+e);
}

}

}
