天天看點

Lucene是什麼?

Lucene是什麼?

Lucene是Apache組織的一個用Java實作全文搜尋引擎的開源項目。後來有人将Lucene移植到。Net語言。

Lucene是一個資訊檢索的函數庫(Library),利用它你可以為你的應用加上索引和搜尋的功能。

Lucene的使用者不需要深入了解有關全文檢索的知識,僅僅學會使用庫中的一個類,你就為你的應用實作全文檢索的功能。

不過千萬别以為Lucene是一個象google那樣的搜尋引擎,Lucene甚至不是一個應用程式,它僅僅是一個工具,一個Library。你也可以把它了解為一個将索引、搜尋功能封裝的很好的一套簡單易用的API。利用這套API你可以做很多有關搜尋的事情,而且很友善。      

Lucene能做什麼?

Lucene可以對任何的資料做索引和搜尋。 Lucene不管資料源是什麼格式,隻要它能被轉化為文字的形式,就可以被Lucene所分析利用。也就是說不管是MS word, Html ,pdf還是其他什麼形式的檔案隻要你可以從中抽取出文字形式的内容就可以被Lucene所用。你就可以用Lucene對它們進行索引以及搜尋。

如何使用Lucene

示例介紹

1.為作為輸入參數的檔案夾下的所有txt類型的檔案做索引,做好的索引檔案放入index檔案夾。

2.然後在索引的基礎上對檔案進行全文搜尋。

1. 建立索引

IndexWriter writer = new IndexWriter("index",new StandardAnalyzer(),true);  

Document doc = new Document(); 

doc.Add(new Field(“city”, ”上海”,Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field(“shopname”,”東北菜”,Field.Store.YES,Field.Index.TOKENIZED));

writer.AddDocument(doc);

doc = new Document(); 

doc.Add(new Field(“city”, ”北京”,Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field(“shopname”,”東北菜菜館”,Field.Store.YES,Field.Index.TOKENIZED));

writer.AddDocument(doc);

writer.SetUseCompoundFile(true);

writer.Optimize();

writer.Close();

2. 對索引進行搜尋

IndexSearcher indexSearcher= new IndexSearcher(indexDir);

QueryParser parser = new QueryParser("shopname", new StandardAnalyzer());

Query query = parser.Parse(“東北”);

Hits hits = indexSearcher.Search(query);

Document doc;

For (int i = 0 ; i < hits.length();i++)

{

   doc = hits.Doc(i);

   doc.Get(“shopname”).ToString()

}

這樣就實作了簡單的全文搜尋了。

Lucene的包結構

Lucene源碼中共包括7個子包,每個包完成特定的功能:  

Lucene包結構功能表
包名 功能
Lucene.NET.Analysis 語言分析器,主要用于的切詞,可以擴充此類以支援多種語言
Lucene.net.Document 索引存儲時的文檔結構管理,類似于關系型資料庫的表結構
Lucene.Net.Index 索引管理,包括索引建立、删除等
Lucene.Net.QueryParser 查詢分析器,實作查詢關鍵詞間的運算,如與、或、非等
Lucene.Net.Search 檢索管理,根據查詢條件,檢索得到結果
Lucene.Net.Store 資料存儲管理,主要包括一些底層的I/O操作
Lucene.Net.Util 一些公用類

建立索引時最重要的幾個概念

Document:一個要進行索引的單元,相當于資料庫的一行紀錄,任何想要被索引的資料,都必須轉化為Document對象存放。

Field:Document中的一個字段,相當于資料庫中的Column。

IndexWriter:負責将Document寫入索引檔案。通常情況下,IndexWriter的構造函數包括了以下3個參數:索引存放的路徑,分析器和是否重新建立索引。特别注意的一點,當IndexWriter執行完addDocument方法後,一定要記得調用自身的close方法來關閉它。隻有在調用了close方法後,索引器才會将存放在内在中的所有内容寫入磁盤并關閉輸出流。

Analyzer:分析器,主要用于文本分詞。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory:索引存放的位置。Lucene提供了兩種索引存放的位置,一種是磁盤,一種是記憶體。一般情況将索引放在磁盤上;相應地Lucene提供了FSDirectory和RAMDirectory兩個類。

Segment:段,是Lucene索引檔案的最基本的一個機關。Lucene說到底就是不斷加入新的Segment,然後按一定的規則算法合并不同的Segment以合成新的Segment。

Lucene建立索引的過程就是将待索引的對象轉化為Lucene的Document對象,使用IndexWriter将其寫入Lucene 自定義格式的索引檔案中。待索引的對象可以來自檔案、資料庫等任意途徑,使用者自行編碼周遊目錄讀取檔案或者查詢資料庫表取得ResultSet,Lucene的API隻負責和字元串打交道。

Field對象

從Lucene的源代碼中,可以看出Field 典型構造函數如下:

Field(String name, String value, Field.Store store, Field.Index index)

其中:

Field.Index有四種屬性,分别是:

Field.Index.TOKENIZED:分詞索引

Field.Index.UN_TOKENIZED:不分詞進行索引,如作者名,日期等,不再需要分詞。

Field.Index.NO:不進行索引,存放不能被搜尋的内容如文檔的一些附加屬性如文檔類型, URL等。

Field.Index.NO_NORMS:不分詞,建索引.但是Field的值不像通常那樣被儲存,而是隻取一個byte,這樣節約存儲空間。

Field.Store也有三個屬性,分别是:

Field.Store.YES:索引檔案本來隻存儲索引資料, 此設計将原文内容直接也存儲在索引檔案中,如文檔的标題。

Field.Store.NO:原文不存儲在索引檔案中,搜尋結果命中後,再根據其他附加屬性如檔案的Path,資料庫的主鍵等,重新連接配接打開原文,适合原文内容較大的情況。

          Field.Store.COMPRESS 壓縮存儲。

Lucene的基本原理和代碼分析:

其中總體架構和索引檔案格式是Lucene 2.9的,索引過程分析是Lucene 3.0的。

鑒于索引檔案格式沒有太大變化,因而原文沒有更新,原理和架構的文章中引用了前輩的一些圖,可能屬于早期的Lucene,但不影響對原理和架構的了解。

本系列文章尚在撰寫之中,将會有分詞器,段合并,QueryParser,查詢語句與查詢對象,搜尋過程,打分公式的推導等章節。

提前給大家分享,希望大家批評指正。 

Lucene學習總結之一:全文檢索的基本原理

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html

Lucene學習總結之二:Lucene的總體架構

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623596.html 

Lucene學習總結之三:Lucene的索引檔案格式(1)

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html

Lucene學習總結之三:Lucene的索引檔案格式(2)

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623599.html

Lucene學習總結之三:Lucene的索引檔案格式(3)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html

Lucene學習總結之四:Lucene索引過程分析(1)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661439.html

Lucene學習總結之四:Lucene索引過程分析(2)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661440.html

Lucene學習總結之四:Lucene索引過程分析(3)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661441.html

Lucene學習總結之四:Lucene索引過程分析(4) 

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661442.html 

本系列文章已在javaeye制作成電子書,可提供下載下傳,謝謝關注。

http://forfuture1978.javaeye.com/blog/pdf 

Lucene是什麼?

Lucene是Apache組織的一個用Java實作全文搜尋引擎的開源項目。後來有人将Lucene移植到。Net語言。

Lucene是一個資訊檢索的函數庫(Library),利用它你可以為你的應用加上索引和搜尋的功能。

Lucene的使用者不需要深入了解有關全文檢索的知識,僅僅學會使用庫中的一個類,你就為你的應用實作全文檢索的功能。

不過千萬别以為Lucene是一個象google那樣的搜尋引擎,Lucene甚至不是一個應用程式,它僅僅是一個工具,一個Library。你也可以把它了解為一個将索引、搜尋功能封裝的很好的一套簡單易用的API。利用這套API你可以做很多有關搜尋的事情,而且很友善。      

Lucene能做什麼?

Lucene可以對任何的資料做索引和搜尋。 Lucene不管資料源是什麼格式,隻要它能被轉化為文字的形式,就可以被Lucene所分析利用。也就是說不管是MS word, Html ,pdf還是其他什麼形式的檔案隻要你可以從中抽取出文字形式的内容就可以被Lucene所用。你就可以用Lucene對它們進行索引以及搜尋。

如何使用Lucene

示例介紹

1.為作為輸入參數的檔案夾下的所有txt類型的檔案做索引,做好的索引檔案放入index檔案夾。

2.然後在索引的基礎上對檔案進行全文搜尋。

1. 建立索引

IndexWriter writer = new IndexWriter("index",new StandardAnalyzer(),true);  

Document doc = new Document(); 

doc.Add(new Field(“city”, ”上海”,Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field(“shopname”,”東北菜”,Field.Store.YES,Field.Index.TOKENIZED));

writer.AddDocument(doc);

doc = new Document(); 

doc.Add(new Field(“city”, ”北京”,Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field(“shopname”,”東北菜菜館”,Field.Store.YES,Field.Index.TOKENIZED));

writer.AddDocument(doc);

writer.SetUseCompoundFile(true);

writer.Optimize();

writer.Close();

2. 對索引進行搜尋

IndexSearcher indexSearcher= new IndexSearcher(indexDir);

QueryParser parser = new QueryParser("shopname", new StandardAnalyzer());

Query query = parser.Parse(“東北”);

Hits hits = indexSearcher.Search(query);

Document doc;

For (int i = 0 ; i < hits.length();i++)

{

   doc = hits.Doc(i);

   doc.Get(“shopname”).ToString()

}

這樣就實作了簡單的全文搜尋了。

Lucene的包結構

Lucene源碼中共包括7個子包,每個包完成特定的功能:  

Lucene包結構功能表
包名 功能
Lucene.NET.Analysis 語言分析器,主要用于的切詞,可以擴充此類以支援多種語言
Lucene.net.Document 索引存儲時的文檔結構管理,類似于關系型資料庫的表結構
Lucene.Net.Index 索引管理,包括索引建立、删除等
Lucene.Net.QueryParser 查詢分析器,實作查詢關鍵詞間的運算,如與、或、非等
Lucene.Net.Search 檢索管理,根據查詢條件,檢索得到結果
Lucene.Net.Store 資料存儲管理,主要包括一些底層的I/O操作
Lucene.Net.Util 一些公用類

建立索引時最重要的幾個概念

Document:一個要進行索引的單元,相當于資料庫的一行紀錄,任何想要被索引的資料,都必須轉化為Document對象存放。

Field:Document中的一個字段,相當于資料庫中的Column。

IndexWriter:負責将Document寫入索引檔案。通常情況下,IndexWriter的構造函數包括了以下3個參數:索引存放的路徑,分析器和是否重新建立索引。特别注意的一點,當IndexWriter執行完addDocument方法後,一定要記得調用自身的close方法來關閉它。隻有在調用了close方法後,索引器才會将存放在内在中的所有内容寫入磁盤并關閉輸出流。

Analyzer:分析器,主要用于文本分詞。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory:索引存放的位置。Lucene提供了兩種索引存放的位置,一種是磁盤,一種是記憶體。一般情況将索引放在磁盤上;相應地Lucene提供了FSDirectory和RAMDirectory兩個類。

Segment:段,是Lucene索引檔案的最基本的一個機關。Lucene說到底就是不斷加入新的Segment,然後按一定的規則算法合并不同的Segment以合成新的Segment。

Lucene建立索引的過程就是将待索引的對象轉化為Lucene的Document對象,使用IndexWriter将其寫入Lucene 自定義格式的索引檔案中。待索引的對象可以來自檔案、資料庫等任意途徑,使用者自行編碼周遊目錄讀取檔案或者查詢資料庫表取得ResultSet,Lucene的API隻負責和字元串打交道。

Field對象

從Lucene的源代碼中,可以看出Field 典型構造函數如下:

Field(String name, String value, Field.Store store, Field.Index index)

其中:

Field.Index有四種屬性,分别是:

Field.Index.TOKENIZED:分詞索引

Field.Index.UN_TOKENIZED:不分詞進行索引,如作者名,日期等,不再需要分詞。

Field.Index.NO:不進行索引,存放不能被搜尋的内容如文檔的一些附加屬性如文檔類型, URL等。

Field.Index.NO_NORMS:不分詞,建索引.但是Field的值不像通常那樣被儲存,而是隻取一個byte,這樣節約存儲空間。

Field.Store也有三個屬性,分别是:

Field.Store.YES:索引檔案本來隻存儲索引資料, 此設計将原文内容直接也存儲在索引檔案中,如文檔的标題。

Field.Store.NO:原文不存儲在索引檔案中,搜尋結果命中後,再根據其他附加屬性如檔案的Path,資料庫的主鍵等,重新連接配接打開原文,适合原文内容較大的情況。

          Field.Store.COMPRESS 壓縮存儲。

Lucene的基本原理和代碼分析:

其中總體架構和索引檔案格式是Lucene 2.9的,索引過程分析是Lucene 3.0的。

鑒于索引檔案格式沒有太大變化,因而原文沒有更新,原理和架構的文章中引用了前輩的一些圖,可能屬于早期的Lucene,但不影響對原理和架構的了解。

本系列文章尚在撰寫之中,将會有分詞器,段合并,QueryParser,查詢語句與查詢對象,搜尋過程,打分公式的推導等章節。

提前給大家分享,希望大家批評指正。 

Lucene學習總結之一:全文檢索的基本原理

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html

Lucene學習總結之二:Lucene的總體架構

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623596.html 

Lucene學習總結之三:Lucene的索引檔案格式(1)

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html

Lucene學習總結之三:Lucene的索引檔案格式(2)

http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623599.html

Lucene學習總結之三:Lucene的索引檔案格式(3)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html

Lucene學習總結之四:Lucene索引過程分析(1)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661439.html

Lucene學習總結之四:Lucene索引過程分析(2)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661440.html

Lucene學習總結之四:Lucene索引過程分析(3)

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661441.html

Lucene學習總結之四:Lucene索引過程分析(4) 

http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661442.html 

本系列文章已在javaeye制作成電子書,可提供下載下傳,謝謝關注。

http://forfuture1978.javaeye.com/blog/pdf