lucene(一) lucene一些概念的理解

fan_rockrock發表於2016-05-16

注:所有關於lucene的知識主要來源於孔浩lucene視訊,小部分來源於其他部落格

孔浩老師lucene視訊下載:點選開啟連結


1 lucene簡介

1.1 什麼是lucene

    Lucene是一個全文搜尋框架,而不是應用產品。因此它並不像www.baidu.com 或者google Desktop那麼拿來就能用,它只是提供了一種工具讓你能實現這些產品。

        在全文檢索工具中,全部都由三個部分組成:索引部分、分詞部分、搜尋部分

2 lucene的工作方式
        lucene提供的服務實際包含兩部分:一入一出。所謂入是寫入,即將你提供的源(本質是字串)寫入索引或者將其從索引中刪除;所謂出是讀出,即向使用者提供全文搜尋服務,讓使用者可以通過關鍵詞定位源。
2.1寫入流程
   源字串首先經過analyzer處理,包括:分詞,分成一個個單詞;去除stopword(可選)。將源中需要的資訊加入Document的各個Field中,並把需要索引的Field索引起來,把需要儲存的Field儲存起來。 將索引寫入儲存器,儲存器可以是記憶體或磁碟。
2.2讀出流程
                 使用者提供搜尋關鍵詞,經過analyzer處理。對處理後的關鍵詞搜尋索引找出對應的Document。使用者根據需要從找到的Document中提取需要的Field。
3 一些需要知道的概念
3.1 analyzer
   Analyzer是分析器,它的作用是把一個字串按某種規則劃分成一個個詞語,並去除其中的無效詞語,這裡說的無效詞語是指英文中的“of”、“the”,中文中的“的”、“地”等詞語,這些詞語在文章中大量出現,但是本身不包含什麼關鍵資訊,去掉有利於縮小索引檔案、提高效率、提高命中率。分詞的規則千變萬化,但目的只有一個:按語義劃分。這點在英文中比較容易實現,因為英文字身就是以單詞為單位的,已經用空格分開;而中文則必須以某種方法將連成一片的句子劃分成一個個詞語
3.2 document
  使用者提供的源是一條條記錄,它們可以是文字檔案、字串或者資料庫表的一條記錄等等。一條記錄經過索引之後,就是以一個Document的形式儲存在索引檔案中的。使用者進行搜尋,也是以Document列表的形式返回。
3.3 field
       一個Document可以包含多個資訊域,例如一篇文章可以包含“標題”、“正文”、“最後修改時間”等資訊域,這些資訊域就是通過Field在Document中儲存的Field有兩個屬性可選:儲存和索引。通過儲存屬性你可以控制是否對這個Field進行儲存;通過索引屬性你可以控制是否對該Field進行索引。這看起來似乎有些廢話,事實上對這兩個屬性的正確組合很重要,下面舉例說明:還是以剛才的文章為例子,我們需要對標題和正文進行全文搜尋,所以我們要把索引屬性設定為真,同時我們希望能直接從搜尋結果中提取文章標題,所以我們把標題域的儲存屬性設定為真,但是由於正文域太大了,我們為了縮小索引檔案大小,將正文域的儲存屬性設定為假,當需要時再直接讀取檔案;我們只是希望能從搜尋解果中提取最後修改時間,不需要對它進行搜尋,所以我們把最後修改時間域的儲存屬性設定為真,索引屬性設定為假。上面的三個域涵蓋了兩個屬性的三種組合,還有一種全為假的沒有用到,事實上Field不允許你那麼設定,因為既不儲存又不索引的域是沒有意義的。
3.4 term
  term是搜尋的最小單位,它表示文件的一個詞語,term由兩部分組成:它表示的詞語和這個詞語所出現的field。
3.5 tocken
        tocken是term的一次出現,它包含term文字和相應的起止偏移,以及一個型別字串。一句話中可以出現多次相同的詞語,它們都用同一個term表示,但是用不同的tocken,每個tocken標記該詞語出現的地方。
3.6 segment
                   新增索引時並不是每個document都馬上新增到同一個索引檔案,它們首先被寫入到不同的小檔案,然後再合併成一個大索引檔案,這裡每個小檔案都是一個segment。
4 如何建索引
4.1 最簡單的能完成索引的程式碼片斷
IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();
下面我們分析一下這段程式碼。
首先我們建立了一個writer,並指定存放索引的目錄為“/data/index”,使用的分析器為StandardAnalyzer,第三個引數說明如果已經有索引檔案在索引目錄下,我們將覆蓋它們。然後我們新建一個document。我們向document新增一個field,名字是“title”,內容是“lucene introduction”,對它進行儲存並索引。再新增一個名字是“content”的field,內容是“lucene works well”,也是儲存並索引。
然後我們將這個文件新增到索引中,如果有多個文件,可以重複上面的操作,建立document並新增。新增完所有document,我們對索引進行優化,優化主要是將多個segment合併到一個,有利於提高索引速度。
  隨後將writer關閉,這點很重要。
4.2 索引文字檔案
    如果你想把純文字檔案索引起來,而不想自己將它們讀入字串建立field,你可以用下面的程式碼建立field:
 Field field = new Field("content", new FileReader(file));這裡的file就是該文字檔案。該建構函式實際上是讀去檔案內容,並對其進行索引,但不儲存。

相關文章