Lucene學習筆記(一)-------Lucene基礎

Lucene簡介

  • 獲取內容

    Lucene作爲一個核心搜索庫,並不提供任何功能來實現內容獲取

  • 建立文檔

    文檔主要包括幾個帶值的域,比如標題(title),正文(body),摘要(abstract),作者(author)和鏈接(URL)

可以向比較重要的單個的文檔或域中插入權值,加權操作可能在索引操作前就靜態完成了,也可能要在搜索期間才動態完成。包括Lucene在內的幾乎所有搜索引擎都會自動地靜態地對內容較短的域進行加權。

Lucene提供了一個API建立域和文檔,但不提供任何建立它們的程序邏輯,因爲這些邏輯完全由調用API的應用程序根據具體情況完成。Lucene也不提供任何文檔過濾器

  • 文檔分析

    將文檔中的文本域分割成詞彙單元(即單詞),常見的有詞幹提取器用於從單詞中提取詞根。Lucene提供了大量內嵌的分析器可以自定義分析鏈

  • 文檔索引

    索引步驟中,文檔被加入到索引列表,索引的優劣直接影響到搜索體驗

  • 搜索組件

    從索引中查找單詞,從而找到包含該單詞的文檔。搜索質量主要由準確率(Precision,衡量搜索系統查找相關文檔的能力)和召回率(Recall,衡量搜索系統過濾非相關文檔的能力)來衡量。Lucene的benchmark/contrib模塊可以衡量搜索程序的準確率和召回率

搜索組件主要包括:

用戶搜索界面: 搜索界面保持簡潔,Lucene不提供默認搜索界面
建立查詢: 將用戶的輸入轉換成合適的查詢(query)對象格式, Lucene提供一個查詢解析器(QueryParser)的強大開發包,可以根據通用查詢語法將用戶輸入的文本處理成查詢對象,查詢語句包含布爾運算、短語查詢、通配符查詢。也可以修改查詢語句,對重要信息進行加權或過濾。
搜索查詢:查詢檢索索引並返回與查詢語句匹配的文檔,結果返回時按照查詢請求來排序。
常用的相關度計算模型包括:

純布爾模型(Pure Boolean Model): 不管文檔是否匹配查詢請求,都不會被評分。在該模型下,匹配文檔與評分不相關,也是無序的;一條查詢僅獲取所有匹配文檔集合的一個子集
向量空間模型(Vector Space Model):查詢語句和文檔都是高維空間的向量模型,這裏每一個獨立的項都是一個維度。查詢語句和文檔之間的相關性或相似性由各自向量之間的距離計算得到
概率模型(Probabilistic Model):在該模型中,採用全概率方法來計算文檔和查詢語句的匹配概率

Lucene在實現上採用向量空間模型和純布爾模型,並能針對具體搜索讓你決定採用哪種類型

展現結果

管理界面:跟蹤程序運行狀況、配置程序各種組件、啓動停止搜索服務
分析模塊:採用不同的視角觀察用戶搜索,從而對搜索程序各模塊的運行給予提示
搜索範圍:使搜索程序能處理越來越大的搜索內容和更多的併發搜索請求,Lucene本身並沒有提供搜索範圍的處理模塊,參見Solr、Nutch和Elasticsearch

索引過程的核心類
  • IndexWriter:寫索引,是索引過程的核心組件,這個類負責創建新索引或者打開已有索引,以及向索引中添加、刪除或更新被索引文檔的信息。可以提供針對索引文件的寫入操作,但不能讀取或搜索。IndexWriter不能直接索引文本,需要Analyzer將文本分割成獨立的單詞。
  • Directory: 描述了Lucene索引的存放位置,它是一個抽象類,它的子類負責具體指定索引的存儲路徑,利用FSDirectory.open方法獲取真實文件在文件系統的存儲路徑,然後將它們依次傳遞給IndexWriter類的構造方法。
  • Analyzer: Analyzer是IndexWriter的構造方法指定的,它負責從被索引文本文件中提取詞彙單元,並剔除剩下的無用信息。非純文本文件需要轉爲文本文檔。Analyzer是一個抽象類,Lucene提供了幾個類實現它。有的用於跳過停用詞(stop words,指一些常用但不能幫助區分文檔的詞,如a、an、the、in和on等);有的用於把詞彙單元轉換成小寫形式,以使搜索過程可以忽略大小寫差別。分析器的分析對象是文檔,該文檔包含一些分離的能被索引的域
  • Document:文檔對象代表一些域(field)的集合。文檔的域代表文檔和文檔相關的一些元數據。
  • Field:索引中的每個文檔都包含一個或多個不同名稱的域即Field類,每個域都有一個域名和對應的域值,以及一組選項來精確控制Lucene索引操作各個閾值。文檔可能擁有不止一個同名的域,在這種情況下,域的值就按照索引操作順序添加進去。在搜索時,所有域的文本就好像連接在一起,作爲一個文本域來處理。
搜索過程的核心類
  • IndexSearcher:用於搜索由IndexWriter類創建的索引(以只讀方式打開索引):它公開了幾個搜索方法,是連接索引的中心環節。需要利用Directory實例來掌控前期創建的索引,然後才能提供大量的搜索方法,其中一些方法在它的抽象父類Searcher中實現。最簡單的搜索方式是將單個Query對象和int topN計數作爲該方法的參數,並返回一個TopDocs對象。
Directory dir = FSDirectory.open("/tmp/index");
IndexSearcher searcher = new IndexSearcher(dir);
Query q = new TermQuery(new Term("content", "lucene"));
TopDocs hits = searcher.search(q, 10);
searcher.close();
  • Term:搜索功能的基本單元,包含一對字符串元素:域名和單詞(或域文本值)。Term對象還與索引操作有關。搜索過程中可以創建Term對象,並和TermQuery對象一起使用
    要尋找contents域中包含單詞lucene的前10個文檔,並按照降序排列這10個文檔。
Query q = new TermQuery(new Term("content", "lucene"));
TopDocs  hits = searcher.search(q, 10);

TermQuery對象是從抽象父類Query派生而來,可以在聲明左側使用Query類型。

  • Query:Lucene包含許多具體的Query(查詢 )子類,包括TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangeQuery、NumericRangeQuery、FilteredQuery和SpanQuery。Query是它們共同的抽象父類。其中setBoost(float)方法給某個子查詢賦予相對其他子查詢對評分更高的權重。

  • TermQuery:Lucene提供最基本的查詢類型,用來匹配指定區域中包含特定項的文檔。

  • TopDocs:負責展示搜索結果,是一個簡單的指針容器,指針一般指向前N個排名的搜索結果,搜索結果即匹配查詢條件的文檔。TopDocs會記錄前N個結果中每個結果的int docID(用以恢復文檔)和浮點型分數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章