<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的原理,才能深入了解該框架在創建索引的核心實現機制。

    主站蜘蛛池模板: 青青免费在线视频| 青青青国产手机频在线免费观看 | 国产成人精品亚洲2020| 国产一区二区视频免费| 野花香在线视频免费观看大全| 亚洲国产精品免费在线观看| 免费久久精品国产片香蕉| 久爱免费观看在线网站| 久久久久久亚洲av无码蜜芽| 国产V亚洲V天堂无码久久久| 成年私人影院免费视频网站| 国产一级a毛一级a看免费视频| 亚洲国产视频久久| 国产日产亚洲系列| 日韩高清在线免费观看| 久久99免费视频| 亚洲精品欧美综合四区| 亚洲AV成人无码久久精品老人| 国产成人精品123区免费视频| 84pao国产成视频免费播放| 青青免费在线视频| 亚洲AV男人的天堂在线观看| 亚洲国产精品无码久久久蜜芽 | 亚洲国产成人VA在线观看| 99久久国产热无码精品免费| 国产成人精品免费大全| 亚洲精品乱码久久久久蜜桃| 91久久亚洲国产成人精品性色 | 亚洲午夜AV无码专区在线播放| 久久久久久精品免费免费自慰| 久久久久免费视频| 西西人体大胆免费视频| 日韩亚洲不卡在线视频中文字幕在线观看 | 女人隐私秘视频黄www免费| 黄页网站在线免费观看| 亚洲天堂免费在线| 亚洲成av人片不卡无码| 亚洲bt加勒比一区二区| 久久亚洲精品无码播放| 亚洲国产午夜中文字幕精品黄网站| 在线免费观看色片|