package phz;
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;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.Query;
/**
* 這個實例包含了lucene所有核心用法
*
* @author panhuizi
*
*/
public class LuceneTest {
public static void main(String[] args) {
try {
LuceneTest luceneTest = new LuceneTest();
// 創建索引
luceneTest.index();
// 在索引所在目錄下搜索"中國 金牌"
luceneTest.search("中國 金牌");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ok");
}
public void index() throws Exception {
/* 創建索引初始化,執行這些語句將創建或清空d:\\save\\目錄下所有索引 */
IndexWriter writer1 = new IndexWriter("d:\\save\\",
new StandardAnalyzer(), true);
writer1.close();
/*
* 往創建的初始化索引中添加索引內容,StandardAnalyzer表示用lucene自帶的標準分詞機制,
* false表示不覆蓋原來該目錄的索引,細心的讀者可能已經發現, 這句話和上面的那句就這個false不一樣
*/
IndexWriter writer2 = new IndexWriter("d:\\save\\",
new StandardAnalyzer(), false);
/* 創建一份文件 */
Document doc1 = new Document();
/*
* 創建一個域ArticleTitle,并往這個域里面添加內容 "Field.Store.YES"表示域里面的內容將被存儲到索引
* "Field.Index.TOKENIZED"表示域里面的內容將被索引,以便用來搜索
*/
Field field1 = new Field("ArticleTitle", "北京2008年奧運會", Field.Store.YES,
Field.Index.TOKENIZED);
/* 往文件里添加這個域 */
doc1.add(field1);
/* 同理:創建另外一個域ArticleText,并往這個域里面添加內容 */
Field field2 = new Field("ArticleText", "這是一屆創造奇跡、超越夢想的奧運會.......",
Field.Store.YES, Field.Index.TOKENIZED);
doc1.add(field2);
// 在這里還可以添加其他域
/* 添加這份文件到索引 */
writer2.addDocument(doc1);
/* 同理:創建第二份文件 */
Document doc2 = new Document();
field1 = new Field("ArticleTitle", "中國獲得全球贊譽", Field.Store.YES,
Field.Index.TOKENIZED);
doc2.add(field1);
field2 = new Field("ArticleText", "中國所取得的金牌總數排行榜的榜首........",
Field.Store.YES, Field.Index.TOKENIZED);
doc2.add(field2);
writer2.addDocument(doc2);
// 在這里可以添加其他文件
/* 關閉 */
writer2.close();
}
public void search(String serchString) throws Exception {
/* 創建一個搜索,搜索剛才創建的d:\\save\\目錄下的索引 */
IndexSearcher indexSearcher = new IndexSearcher("d:\\save\\");
/* 在這里我們只需要搜索一個目錄 */
IndexSearcher indexSearchers[] = { indexSearcher };
/* 我們需要搜索兩個域"ArticleTitle", "ArticleText"里面的內容 */
String[] fields = { "ArticleTitle", "ArticleText" };
/* 下面這個表示要同時搜索這兩個域,而且只要一個域里面有滿足我們搜索的內容就行 */
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,
BooleanClause.Occur.SHOULD };
/*
* MultiFieldQueryParser表示多個域解析,
* 同時可以解析含空格的字符串,如果我們搜索"中國 金牌",根據前面的索引,顯然搜到的是第二份文件
*/
Query query = MultiFieldQueryParser.parse(serchString, fields, clauses,
new StandardAnalyzer());
/* Multisearcher表示多目錄搜索,在這里我們只有一個目錄 */
MultiSearcher searcher = new MultiSearcher(indexSearchers);
/* 開始搜索 */
Hits h = searcher.search(query);
/* 把搜索出來的所有文件打印出來 */
for (int i = 0; i < h.length(); i++) {
/* 打印出文件里面ArticleTitle域里面的內容 */
System.out.println(h.doc(i).get("ArticleTitle"));
/* 打印出文件里面ArticleText域里面的內容 */
System.out.println(h.doc(i).get("ArticleText"));
}
/* 關閉 */
searcher.close();
}
}