了解lucene的基本概念
這一部分可以參考我以前寫的博客:
http://www.cnblogs.com/skyme/tag/lucene/
lucene是什么
下圖是一個很好的說明:
1、lucene是構建索引、查詢、高亮、拼寫檢查的類庫。
2、它不是一個爬蟲。
3、不提供分布式的索引。
lucene全文搜索處理流程
lucene的索引和查詢
這是用4.6版本構建的lucene構建索引和查詢的示例:
public static void main(String[] args) throws IOException, ParseException { // 一、創建索引 // 內存索引模板 Directory dir = new RAMDirectory(); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer); IndexWriter indexWriter = new IndexWriter(dir, config); Document doc = new Document(); String title = "標題"; String content = "被索引的內容"; Field f1 = new Field("title", title, TextField.TYPE_STORED); Field f2 = new Field("content", content, TextField.TYPE_STORED); doc.add(f1); doc.add(f2); indexWriter.addDocument(doc); indexWriter.close(); // 二、搜索 DirectoryReader directoryReader = DirectoryReader.open(dir); IndexSearcher indexSearcher = new IndexSearcher(directoryReader); QueryParser parser = new QueryParser(Version.LUCENE_46, "content", analyzer); Query query = parser.parse("內容"); TopDocs topDocs = indexSearcher.search(query, null, 100); ScoreDoc[] hits = topDocs.scoreDocs; System.out.println("查詢結果數:" + hits.length); for (int n = 0; n < hits.length; n++) { Document hitDoc = indexSearcher.doc(hits[n].doc); System.out.println("搜索的結果title:" + hitDoc.get("title")); } }
上面是一個簡單的在內存中構建索引并且進行查詢的例子。
然后看一下lucene索引用到的類:
再看一下查詢用到的類:
理解索引過程
索引的過程可以簡述為:
lucene加權
這部分內容可以參考:
http://www.cnblogs.com/hongten/archive/2013/02/01/hongten_lucene_baidu.html
Directory子類
FSDirectory
FSDirectory是Lucene對文件系統的操作,它有下面三個子類SimpleFSDirectory、MmapDirectory、NIOFSDirectory;
FSDirectory是一個抽象類,具體實現由子類來完成。
1、SimpleFSDirectory
最簡單的FSDirectory子類,使用java.io.*API將文件存入文件系統中,不能很好支持多線程操作。因為要做到這點就必須在內部加入鎖,而java.io.*并不支持按位置讀取。
2、NIOFSDirectory
使用java.io.*API所提供的位置讀取接口,能很好的支持除Windows之外的多線程操作,原因是Sun的JRE在Windows平臺上長期存在問題。
NIOFSDirectory在Windows操作系統的性能比較差,甚至可能比SimpleFSDirecory的性能還差。
3、MmapDirectory
使用內存映射的I/O接口進行讀操作,這樣不需要采取鎖機制,并能很好的支持多線程讀操作。但由于內存映射的I/O所消耗的地址空間是與索引尺寸相等,所以建議最好只是用64位JRE。
QueryParser
queryparser的解析過程:
1、使用queryparser完成解析搜索請求
2、基本格式如:
QueryParser parser=new QueryParser("字段名稱","分析器實例");
Query q=parser.parse("關鍵詞")
3、例如:解析一個關鍵字太陽
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太陽");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
4、解析多個關鍵字太陽、月亮
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太陽 月亮");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
4、帶參數的多個關鍵字解析
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太陽 月亮");
parser.setDefaultOperator(QueryParser.Opertator.AND);//同時含有多個關鍵字,如果是QueryParser.Opertator.OR表示或者
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
IndexSearcher
下圖是搜索用到的相關的類:
lucene的擴展工程
1、solr
Solr是一個高性能,采用Java5開發,基于Lucene的全文搜索服務器。文檔通過Http利用XML加到一個搜索集合中。查詢該集合也是通過 http收到一個XML/JSON響應來實現。它的主要特性包括:高效、靈活的緩存功能,垂直搜索功能,高亮顯示搜索結果,通過索引復制來提高可用性,提供一套強大Data Schema來定義字段,類型和設置文本分析,提供基于Web的管理界面等。
2、ElasticSearch
ElasticSearch是一個基于Lucene構建的開源,分布式,RESTful搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。支持通過HTTP使用JSON進行數據索引。
3、IndexTank
IndexTank是一套基于Java的索引-實時全文搜索引擎實現,它的設計分離了相關性標記和文檔內容,因為相關性標記的生命周期和文檔本身是不一樣的,特別是在用戶創建的內容的情況下,例如分享次數,Like按鈕,+1按鈕等等。
4、Katta
Katta是一個可擴展的、故障容錯的、分布式實施訪問的數據存儲。
Katta可用于大量、重復、索引的碎片,以滿足高負荷和巨大的數據集。這些索引可以是不同的類型。當前該實現在Lucene和Hadoop mapfiles。
5、bobo-browse
bobo-browse是一用java寫的lucene擴展組件,通過它可以很方便在lucene上實現分組統計功能。
比如說搜索電腦,可以得到cpu是intel的有幾條命中記錄,cpu是amd的有幾條命中記錄。
6、Compass
Compass是一個強大的,事務的,高性能的對象/搜索引擎映射(OSEM:object/search engine mapping)與一個Java持久層框架。Compass包括:
- 搜索引擎抽象層(使用Lucene搜索引薦),
- OSEM(Object/Search Engine Mapping)支持,
- 事務管理,
- 類似于Google的簡單關鍵字查詢語言,
- 可擴展與模塊化的框架,
- 簡單的API
7、Summa
Summa是一種由java開發的,快速模塊化和可擴展的搜索引擎。Summa有如下特點:
- 綜合搜索Summa能夠同時訪問許多不同的數據和資料來源,并以一個統一的接口公開
- 模塊化設計Summa搜索系統由一系列獨立模塊組成,這樣使得它更簡單容易地被維護和升級
- 可擴展性Summa支持分布式架構而且能夠按比例的擴大或縮小以處理任何數量的數據
- 開放標準Summa基于現代web技術與標準,不包含任何私有代碼或原理
- 故障容錯如果某單一數據資源或服務出錯,Summa將會繼續運行而不受出錯部分限制
8、Constellio
Constellio是一個開源的搜索解決方案,適合企業級的搜索。基于Apache Solr項目構建,使用Lucene做為搜索引擎,并提供基于Web的網頁和文檔的檢索。可選擇文檔類型、文件夾以及文件名進行檢索。
應用
下面給出一個我們實際過程中的使用模型,用于比對系統中的類目關系:
上圖中的匹配過濾功能使用lucene完成。
文章列表