1. 程式人生 > 其它 >跟我一起雲端計算(4)——lucene

跟我一起雲端計算(4)——lucene

瞭解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完成。