Lucene
今天由湯陽光老師(不如說是湯兄)給我們講lucene,一見湯兄,太年輕了,真是這感覺真讓我有些小慚愧,呵呵。。。還是學好技術是第一要務。
從
現在到年前都是湯兄給我們上課,今天和明天是搜索引擎,存儲數據用的是Hibernate,全文檢索的簡化框架是Compass,Lucene講1.5
天,Compass講半天。總結一天所學的.全文檢索是目前最流行的技術,由于用數據庫搜索實現的匹配度,相關度排序和搜索速度太慢,而這些都非常致命。
下面詳細回顧:
1.信息檢索:找出與用戶需求相關的信息
平時接觸的信息有文:html,doc,pdf和 txt,
多媒體:音頻,視頻,圖片...
全文檢索: 1.只關注文本。比如我搜索:中國的首都在哪里?和我搜索中國 首都
北京是一樣的,我們主要是研究出現了某些詞的文本 2.不處理語義,只是詞匹配
全文檢索的作用:1.bbs,blog,news,商城的站內搜索,資源有限
Eclipse的幫助就是用Lucene做的
2.入門
運行原理/入門概念
Hello World
需求:就像百度的搜索框一樣,輸入內容,點擊搜索,得出結果,并且要求時間非常短
后臺:點搜索后,會去信息集合(索引庫)里搜索,注:這個索引庫是按照一定的結構存儲,這個結構可以實現快速搜索
使用流程:1事先就不停再找,建立索引,2.搜索
索引庫的結構:索引庫是存到一些二進制文件,這些文件在同一個目錄下 --à索引庫目錄
Document 一條數據
Field 數據中的一個字段
Field是組成Document的元素
實現:
步驟:1.建立索引
2.搜索
都用到的是分詞器(analyzer),應使用同一種分詞器
實現HelloWorld:添加jar包
lucene-core-2.4.0.jar(核心);
contrib/analyzers/lucene-analyzers-2.4.0.jar(分詞器);
contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);
1.建立Article.java,屬性有id,title,content
2.HelloWorld.java.兩個主要方法:
1.建立索引:
createIndex()
2.搜索
search()
進行搜索
public void search() throws Exception {
String
queryString = "document";
//
1,把要搜索的文本解析為 Query
String[]
fields = { "name", "content" };
QueryParser queryParser = new
MultiFieldQueryParser(fields, analyzer);
Query query
= queryParser.parse(queryString);
//
2,進行查詢
IndexSearcher indexSearcher = new IndexSearcher(indexPath);
Filter
filter = null;
TopDocs
topDocs = indexSearcher.search(query, filter, 10000);
System.out.println("總共有【"+topDocs.totalHits+"】條匹配結果");
// 3,打印結果
for(ScoreDoc
scoreDoc : topDocs.scoreDocs){
int docSn = scoreDoc.doc; // 文檔內部編號
Document doc = indexSearcher.doc(docSn); // 根據編號取出相應的文檔
File2DocumentUtils.printDocumentInfo(doc; // 打印出文檔信息
}
}
IndexWriter:操作索引庫,增刪改
主要方法介紹:
// 構造方法:如果索引庫不存在,會自動創建。如果存在,就使用他
new IndexWriter(String/Directory indexPath, Analyzer a,
MaxFieldLength mfl)
// 構造方法:第三個參數指定是否創建一個新的索引庫。
// 1,有索引庫,create為true:會重新創建。2,沒有索引庫,create為false,會報錯。
new IndexWriter(String/Directory indexPath, Analyzer a, boolean
create, MaxFieldLe
ngth mfl)
// 添加索引
addDocument( Document doc )
// 更新
updateDocument(Term term, Document doc)
// 刪除
deleteDocument(Term term)
// 合并索引庫
addIndexesNoOptimize(Directory[])
今天學了Lucene的入門,明天學習Lucene的高級知識,以及compass框架!
// 優化索引庫
optimize()
IndexSearcher:操作索引庫,查詢
// 構造方法,索引庫不存在,就報錯
new IndexSearcher( String indexPath )
// 搜索
TopDocs search( Query query, Filter filer, int n )
// 搜索
TopDocs search( Query query, Filter filer, int n , Sort sort)
Document doc( int docSn )
Documet:Lucene所操作的對象
Field:組成Document的元素,代表一個屬性。Store、Index
new Field( String name, String value, Store
store, Index index )
Directory:索引庫(目錄)
FSDirectory
:真實的目錄