跟我一塊兒雲計算(4)——lucene

瞭解lucene的基本概念

這一部分能夠參考我之前寫的博客:html

http://www.cnblogs.com/skyme/tag/lucene/java

lucene是什麼

下圖是一個很好的說明:web

image

一、lucene是構建索引、查詢、高亮、拼寫檢查的類庫。緩存

二、它不是一個爬蟲。服務器

三、不提供分佈式的索引。多線程

lucene全文搜索處理流程

image

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索引用到的類:框架

image

再看一下查詢用到的類:分佈式

image

理解索引過程

索引的過程能夠簡述爲:

image

lucene加權

這部份內容能夠參考:

http://www.cnblogs.com/hongten/archive/2013/02/01/hongten_lucene_baidu.html

Directory子類

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的解析過程:

image

一、使用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);

IndexSearcher

下圖是搜索用到的相關的類:

image

lucene的擴展工程

一、solr

Solr是一個高性能,採用Java5開發,基於Lucene的全文搜索服務器。文檔經過Http利用XML加到一個搜索集合中。查詢該集合也是經過 http收到一個XML/JSON響應來實現。它的主要特性包括:高效、靈活的緩存功能,垂直搜索功能,高亮顯示搜索結果,經過索引複製來提升可用性,提供一套強大Data Schema來定義字段,類型和設置文本分析,提供基於Web的管理界面等。

image

二、ElasticSearch

ElasticSearch是一個基於Lucene構建的開源,分佈式,RESTful搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。支持經過HTTP使用JSON進行數據索引。

image

三、IndexTank

IndexTank是一套基於Java的索引-實時全文搜索引擎實現,它的設計分離了相關性標記和文檔內容,由於相關性標記的生命週期和文檔自己是不同的,特別是在用戶建立的內容的狀況下,例如分享次數,Like按鈕,+1按鈕等等。

四、Katta

Katta是一個可擴展的、故障容錯的、分佈式實施訪問的數據存儲。

Katta可用於大量、重複、索引的碎片,以知足高負荷和巨大的數據集。這些索引能夠是不一樣的類型。當前該實如今Lucene和Hadoop mapfiles。

image

五、bobo-browse

bobo-browse是一用java寫的lucene擴展組件,經過它能夠很方便在lucene上實現分組統計功能。

好比說搜索電腦,能夠獲得cpu是intel的有幾條命中記錄,cpu是amd的有幾條命中記錄。

六、Compass

Compass是一個強大的,事務的,高性能的對象/搜索引擎映射(OSEM:object/search engine mapping)與一個Java持久層框架。Compass包括:

  • 搜索引擎抽象層(使用Lucene搜索引薦),
  • OSEM(Object/Search Engine Mapping)支持,
  • 事務管理,
  • 相似於Google的簡單關鍵字查詢語言,
  • 可擴展與模塊化的框架,
  • 簡單的API

七、Summa

Summa是一種由java開發的,快速模塊化和可擴展的搜索引擎。Summa有以下特色:

  • 綜合搜索Summa可以同時訪問許多不一樣的數據和資料來源,並以一個統一的接口公開
  • 模塊化設計Summa搜索系統由一系列獨立模塊組成,這樣使得它更簡單容易地被維護和升級
  • 可擴展性Summa支持分佈式架構並且可以按比例的擴大或縮小以處理任何數量的數據
  • 開放標準Summa基於現代web技術與標準,不包含任何私有代碼或原理
  • 故障容錯若是某單一數據資源或服務出錯,Summa將會繼續運行而不受出錯部分限制

八、Constellio

Constellio是一個開源的搜索解決方案,適合企業級的搜索。基於Apache Solr項目構建,使用Lucene作爲搜索引擎,並提供基於Web的網頁和文檔的檢索。可選擇文檔類型、文件夾以及文件名進行檢索。

應用

下面給出一個咱們實際過程當中的使用模型,用於比對系統中的類目關係:

類目品牌匹配過濾

上圖中的匹配過濾功能使用lucene完成。

相關文章
相關標籤/搜索