這一部分能夠參考我之前寫的博客:html
http://www.cnblogs.com/skyme/tag/lucene/java
下圖是一個很好的說明:web
一、lucene是構建索引、查詢、高亮、拼寫檢查的類庫。緩存
二、它不是一個爬蟲。服務器
三、不提供分佈式的索引。多線程
這是用4.6版本構建的lucene構建索引和查詢的示例:架構
public static void main(String[] args) throws IOException, ParseException { // 1、建立索引 // 內存索引模板 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(); // 2、搜索 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")); } }
上面是一個簡單的在內存中構建索引而且進行查詢的例子。app
而後看一下lucene索引用到的類:框架
再看一下查詢用到的類:分佈式
索引的過程能夠簡述爲:
這部份內容能夠參考:
http://www.cnblogs.com/hongten/archive/2013/02/01/hongten_lucene_baidu.html
FSDirectory
FSDirectory是Lucene對文件系統的操做,它有下面三個子類SimpleFSDirectory、MmapDirectory、NIOFSDirectory;
FSDirectory是一個抽象類,具體實現由子類來完成。
一、SimpleFSDirectory
最簡單的FSDirectory子類,使用java.io.*API將文件存入文件系統中,不能很好支持多線程操做。由於要作到這點就必須在內部加入鎖,而java.io.*並不支持按位置讀取。
二、NIOFSDirectory
使用java.io.*API所提供的位置讀取接口,能很好的支持除Windows以外的多線程操做,緣由是Sun的JRE在Windows平臺上長期存在問題。
NIOFSDirectory在Windows操做系統的性能比較差,甚至可能比SimpleFSDirecory的性能還差。
三、MmapDirectory
使用內存映射的I/O接口進行讀操做,這樣不須要採起鎖機制,並能很好的支持多線程讀操做。但因爲內存映射的I/O所消耗的地址空間是與索引尺寸相等,因此建議最好只是用64位JRE。
queryparser的解析過程:
一、使用queryparser完成解析搜索請求
二、基本格式如:
QueryParser parser=new QueryParser("字段名稱","分析器實例");
Query q=parser.parse("關鍵詞")
三、例如:解析一個關鍵字太陽
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太陽");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
四、解析多個關鍵字太陽、月亮
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太陽 月亮");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
四、帶參數的多個關鍵字解析
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);
下圖是搜索用到的相關的類:
一、solr
Solr是一個高性能,採用Java5開發,基於Lucene的全文搜索服務器。文檔經過Http利用XML加到一個搜索集合中。查詢該集合也是經過 http收到一個XML/JSON響應來實現。它的主要特性包括:高效、靈活的緩存功能,垂直搜索功能,高亮顯示搜索結果,經過索引複製來提升可用性,提供一套強大Data Schema來定義字段,類型和設置文本分析,提供基於Web的管理界面等。
二、ElasticSearch
ElasticSearch是一個基於Lucene構建的開源,分佈式,RESTful搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。支持經過HTTP使用JSON進行數據索引。
三、IndexTank
IndexTank是一套基於Java的索引-實時全文搜索引擎實現,它的設計分離了相關性標記和文檔內容,由於相關性標記的生命週期和文檔自己是不同的,特別是在用戶建立的內容的狀況下,例如分享次數,Like按鈕,+1按鈕等等。
四、Katta
Katta是一個可擴展的、故障容錯的、分佈式實施訪問的數據存儲。
Katta可用於大量、重複、索引的碎片,以知足高負荷和巨大的數據集。這些索引能夠是不一樣的類型。當前該實如今Lucene和Hadoop mapfiles。
五、bobo-browse
bobo-browse是一用java寫的lucene擴展組件,經過它能夠很方便在lucene上實現分組統計功能。
好比說搜索電腦,能夠獲得cpu是intel的有幾條命中記錄,cpu是amd的有幾條命中記錄。
六、Compass
Compass是一個強大的,事務的,高性能的對象/搜索引擎映射(OSEM:object/search engine mapping)與一個Java持久層框架。Compass包括:
七、Summa
Summa是一種由java開發的,快速模塊化和可擴展的搜索引擎。Summa有以下特色:
八、Constellio
Constellio是一個開源的搜索解決方案,適合企業級的搜索。基於Apache Solr項目構建,使用Lucene作爲搜索引擎,並提供基於Web的網頁和文檔的檢索。可選擇文檔類型、文件夾以及文件名進行檢索。
下面給出一個咱們實際過程當中的使用模型,用於比對系統中的類目關係:
上圖中的匹配過濾功能使用lucene完成。