Lucene搜索流程(1.Directory)

由於工做上的一些緣由,還有一些我的的緣由,很久沒有寫博客了,最近新版本轉測試了,並且搞搜索引擎這麼久了,總以爲要寫點什麼來看看本身到底會了些什麼東西,同時在網上看到了不少對Lucene搜索介紹的文章,有複雜的,有簡單的,複雜的對初學者來講太過深奧了,簡單的對想要進一步學習的人來講又太過淺顯了,今天我就寫下這篇Lucene的搜索原理的文章,一是給本身鞏固一下,順便高清楚一些本身的疑惑點,同時也但願可以幫助到那些剛剛接觸到Lucene不久的人,廢話到此,正文開始。java

先從大致上來講,Lucene的搜索過程包括如下幾個,從下到上(用戶調用API到獲取數據)能夠這樣看:數組

打開Directory-->

打開IndexReader-->

構建IndexSearcher-->

重寫用戶查詢(Query)-->

生成權重信息(Weight)-->

搜索(Search)-->

打分文檔處理(Scorer)-->

排序處理(Sorter)-->

返回結果(TopDocs)-->

獲取存儲信息(Document,最終結果)

大致的工做流程就是上面了,如今咱們一步步的來了解下

一、打開Directory

對於這一步驟,相信對Lucene有過入門瞭解的人都知道,Lucene的索引的存儲系統都是基於Direcotry系統的,全部的索引讀寫操做都是基於Directory的,對底層來講(本地文件、網絡文件、內存文件),Directory創建出了一個統一的抽象層,供本身使用,看看Directory這個類,咱們發現有兩個重要的方法
/** Returns a stream reading an existing file. */
  public abstract IndexInput openInput(String name)
    throws IOException;//打開讀索引的流


  /** Creates a new, empty file in the directory with the given name.
      Returns a stream writing this file. */
  public abstract IndexOutput createOutput(String name)
       throws IOException;//打開一個寫索引的流

  Lucene正是在在這兩個方法上創建起了和索引存儲的讀寫通道,然而對於咱們常常用的FSDirectory,你們必定不陌生了,如下代碼常常使用:
public static FSDirectory open(File path);

這個方法裏面,lucene替咱們作了些什麼事情?
其實看源碼不難發現:
public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {
    if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX)
          && Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {
      return new MMapDirectory(path, lockFactory);
    } else if (Constants.WINDOWS) {
      return new SimpleFSDirectory(path, lockFactory);
    } else {
      return new NIOFSDirectory(path, lockFactory);
    }
  }    

其實Lucene就是幫咱們判斷了當前咱們所使用的操做系統環境和JRE的不一樣,而後選用不一樣的FSDirectory的實現來提高底層文件的操做性能,這一點仍是很是有用的,這裏的三個MMapDirectory、SimpleFSDirectory、NIOFSDirectory咱們只作簡單的介紹緩存

 MMapDirectory(Memory Map Directory)是一個基於內存到文件映射實現的FSD,主要是openInput返回的MMapIndexInput,使用了buffer的操做來代替原始的流的操做,這一特性能夠在支持文件到內存映射的環境下對索引的讀帶來性能提高。網絡

SimpleFSDirectory,一看名字就知道,就是用了最原始的文件流的操做(基於RandomAccessFile),在不支持MMap的Windows環境下,這是首選。dom

NIOFSDirectory(基於NIO的目錄系統),什麼是NIO?大家知道麼?大家瞭解麼?。。。。。。。。知道的就好,不知道的話,請到谷歌百度一下,哈哈,開個玩笑,不過NIO出來這麼久了,相信你們多少都有些瞭解了,就是一個非阻塞的IO系統,這個NIO在Windows下的實現性能提高不是很大,可是在Linux上,性能的提高就很明顯了,具體緣由請到谷歌百度一下,這裏不做大篇幅介紹(其實我也不是很清楚,哈哈:) ,不能誤人子弟啊 ),而後在這裏若是是Linux系統,lucene就自做主張的幫咱們選擇了NIOD了。性能

OK,關於FSDirectory的介紹就到這裏,下面還有一位Directory的大拿要介紹給你們------RAMDirectory學習

Lucene裏面的類起的名字都挺通俗易懂的,RAM-內存,就是說,這個目錄是創建在內存中的,內存對一個計算機來講是很是寶貴的資源的,可是寶貴就是寶貴在它很是的快,並且容量有限,因此這玩意不是咱們索引的最終目的地,能夠把它當作一個高速緩存,用來緩存那些頻繁更改的索引。說道RAMD的操做原來很簡單,用一個Map構成一個文件系統,而後用一系列的數組當作文件的內容,咱們的對文件操做就變成對數組的操做啦。測試

有了Directory,就創建起咱們查詢索引的第一步,咱們就能夠邁出通往搜索的第一步啦,時間有限(上班中....)第一篇文章先寫到這裏,有什麼意見和不對之處,請你們提出來,若是有興趣,請關注我後面的文章 ^_^this

相關文章
相關標籤/搜索