<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    葉明的javablog

    java學習天堂,個人關于其他blog:blog.javaworker.cn,歡迎大家訪問
    posts - 64, comments - 50, trackbacks - 0, articles - 3

    1、indexWriter類主要功能是對索引的創建,加入Document后,合并各種索引段,以及控制與索引相關的其他方面,它是lucene索引的主要操縱者。

    2、我們首先看看IndexWriter的構造函數

    public IndexWriter(String path, Analyzer a, boolean create, MaxFieldLength mfl)

    public IndexWriter(String path, Analyzer a, boolean create)(廢棄,不提倡使用)

    public IndexWriter(File path, Analyzer a, boolean create, MaxFieldLength mfl)

    public IndexWriter(File path, Analyzer a, boolean create)(廢棄,不提倡使用)

    public IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl)

    public IndexWriter(Directory d, Analyzer a, boolean create)(廢棄,不提倡使用)

    public IndexWriter(String path, Analyzer a, MaxFieldLength mfl)

    public IndexWriter(String path, Analyzer a)(廢棄,不提倡使用)

    public IndexWriter(File path, Analyzer a, MaxFieldLength mfl)

    public IndexWriter(File path, Analyzer a)(廢棄,不提倡使用)

    public IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl)

    public IndexWriter(Directory d, Analyzer a)(廢棄,不提倡使用)

    public IndexWriter(Directory d, boolean autoCommit, Analyzer a)(廢棄,不提倡使用)

    public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create)(廢棄,不提倡使用)

    public IndexWriter(Directory d, Analyzer a, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)

    public IndexWriter(Directory d, boolean autoCommit, Analyzer a, IndexDeletionPolicy deletionPolicy)(廢棄,不提倡使用)

    public IndexWriter(Directory d, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)

    public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy)(廢棄,不提倡使用)

    細心的讀者肯定會發現,廢棄的構造函數與提倡使用的構造函數,多了一個MaxFieldLength參數。帶有該參數的構造函數都是允許正常使用的。(注釋:廢棄的構造函數將在Lucene3.0中移除)

    仔細查看其構造函數的實現呢,最終都轉化成一個私有的構造函數:如圖:

    /**

    該構造函數主要是創建一個IndexWrite對象

    * d :指定的存放建立索引文件的索引目錄

    * a :Analyzer  分詞分析器

    * create :是否要重新寫入索引文件,如果為true,則重寫索引文件;如果為false,則追加寫入索引文件

    * closeDir :一個boolean型變量,表示是否關閉索引目錄Directory d,與IndexWriter的一個成員變量相關

    * deletionPolicy :指定刪除索引文件使用的策略

    * autoCommit :建立索引文件后,自動提交。

    * maxFieldLength : 表示索引中Field的最大長度。

    */

    private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, IndexDeletionPolicy deletionPolicy, boolean autoCommit, int maxFieldLength)

        throws CorruptIndexException, LockObtainFailedException, IOException {

        this.closeDir = closeDir;

        directory = d;

        analyzer = a;

        setMessageID(defaultInfoStream);//這里主要是指定infoStream,是一個PrintStream輸出流對象

        this.maxFieldLength = maxFieldLength; //指定Field數據的最大長度

        if (create) {

          // 如果是重新創建索引文件,清除寫鎖文件write.lock

          directory.clearLock(WRITE_LOCK_NAME);

        }

        Lock writeLock = directory.makeLock(WRITE_LOCK_NAME);

        if (!writeLock.obtain(writeLockTimeout)) // 獲取寫鎖文件

          throw new LockObtainFailedException("Index locked for write: " + writeLock);

        this.writeLock = writeLock;             //保存新的寫鎖文件

        try {

          if (create) {

            // 如果create為true,表示重寫索引文件。重寫索引文件之前,要先讀取已經存在的索引文件,并且要清除掉歷史寫入的segment信息

            try {

              segmentInfos.read(directory);

              segmentInfos.clear();

            } catch (IOException e) {

            }

            segmentInfos.commit(directory);  // 向指定的索引存放目錄中寫入segment信息   

          } else {

            segmentInfos.read(directory); //讀取segment信息

            // We assume that this segments_N was previously

            // properly sync'd:

            for(int i=0;i<segmentInfos.size();i++) {

              final SegmentInfo info = segmentInfos.info(i);

              List files = info.files();

              for(int j=0;j<files.size();j++)

                synced.add(files.get(j));

            }

          }

          this.autoCommit = autoCommit; //執行提交寫入索引的標志 

          setRollbackSegmentInfos(segmentInfos); //克隆原來的segment狀態信息,并且將信息保存到HashSet。

          docWriter = new DocumentsWriter(directory, this); //創建一個DocumentsWriter對象

          docWriter.setInfoStream(infoStream); //設置DocumentsWriter對象的infoStream信息

          docWriter.setMaxFieldLength(maxFieldLength); //設置DocumentsWriter對象的maxFieldLength信息

          //默認的刪除策略實現類為KeepOnlyLastCommitDeletionPolicy,它只是保證將最近提交刪除的索引文件,提交刪除動作 

          // IndexFileDeleter deleter是IndexWriter類的一個私有的成員變量,它在org.apache.lucene.index包里面,主要對刪除索引文件進行實現和管理 

          deleter = new IndexFileDeleter(directory,

                                         deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy,

                                         segmentInfos, infoStream, docWriter);

          pushMaxBufferedDocs(); //刷新DocsBuffer。

          if (infoStream != null) { //如果infoStream是null

            message("init: create=" + create);

            messageState();

          }

        } catch (IOException e) {

          this.writeLock.release();

          this.writeLock = null;

          throw e;

        }

      } 

      通過IndexWrite的構造函數,以及最終的實現方法的init分發,其主要是實現了根據指定的建立索引的方式(重寫、追加寫入),通過create標志位來判斷,從而指定一種在操作索引文件的過程中刪除索引文件的策略。

    在理解lucene的時間,必須熟悉其初始化IndexWrite的原理,才能深入了解該框架在創建索引的核心實現機制。

    主站蜘蛛池模板: 黄色片网站在线免费观看| 亚洲中文字幕久久精品无码2021| 亚洲精品无码永久在线观看男男| 91av视频免费在线观看| 亚洲视频在线观看免费| 日韩午夜理论免费TV影院| 久久久久久亚洲Av无码精品专口| 日本不卡免费新一区二区三区| 国产v亚洲v天堂无码网站| 国产一级淫片a免费播放口| 久久精品国产亚洲综合色| 久久国产乱子伦精品免费看| 久久精品蜜芽亚洲国产AV| 51在线视频免费观看视频| 亚洲婷婷综合色高清在线| 成人黄动漫画免费网站视频| 亚洲成a人片在线不卡一二三区 | 亚洲中文字幕伊人久久无码| 男女啪啪免费体验区| 亚洲自偷自偷图片| 一区二区在线免费观看| 亚洲国产日韩精品| 又黄又爽一线毛片免费观看 | 羞羞视频免费网站日本| 亚洲欧洲日产国码无码久久99| 久久久久成人片免费观看蜜芽 | 免费国产黄线在线观看| 亚洲av无码一区二区三区人妖 | 亚洲av永久无码精品天堂久久 | 四虎免费永久在线播放| 本免费AV无码专区一区| 亚洲一级毛片在线播放| 国产成人精品免费视频软件| www.av在线免费观看| 777亚洲精品乱码久久久久久 | 在线看片韩国免费人成视频| 麻豆亚洲AV成人无码久久精品| 亚洲精品无码乱码成人| 免费看片免费播放| 久久国产乱子精品免费女| 亚洲中文字幕一二三四区|