官术网_书友最值得收藏!

3.2.12 多線程寫索引

Lucene默認只使用一個線程寫索引,而且一個索引只能由一個進程打開。

        public class ThreadedIndexWriter extends IndexWriter {


          private ExecutorService threadPool;
          private Analyzer defaultAnalyzer;


          private class Job implements Runnable {           //保留要加入索引的一個文檔
            Document doc;
            Analyzer analyzer;
            Term delTerm;
            public Job(Document doc, Term delTerm, Analyzer analyzer) {
              this.doc = doc;
              this.analyzer = analyzer;
              this.delTerm = delTerm;
            }
            public void run() {                        //實際增加和更新文檔
              try {
              if (delTerm ! = null) {
                ThreadedIndexWriter.super.updateDocument(delTerm, doc, analyzer);
              } else {
                ThreadedIndexWriter.super.addDocument(doc, analyzer);
              }
              } catch (IOException ioe) {
              throw new RuntimeException(ioe);
      }
    }
  }


  public ThreadedIndexWriter(Directory dir, Analyzer a,
                          boolean create, int numThreads,
                          int maxQueueSize, IndexWriter.MaxFieldLength mfl)
       throws CorruptIndexException, IOException {
    super(dir, a, create, mfl);
    defaultAnalyzer = a;
    threadPool = new ThreadPoolExecutor(             //創建線程池
          numThreads, numThreads,
          0, TimeUnit.SECONDS,
          new ArrayBlockingQueue<Runnable>(maxQueueSize, false),
          new ThreadPoolExecutor.CallerRunsPolicy());
  }


  public void addDocument(Document doc) {             //讓線程池增加文檔
    threadPool.execute(new Job(doc, null, defaultAnalyzer));
  }


  public void addDocument(Document doc, Analyzer a) {   //讓線程池增加文檔
    threadPool.execute(new Job(doc, null, a));
  }


  public void updateDocument(Term term, Document doc) {   //讓線程池更新文檔
    threadPool.execute(new Job(doc, term, defaultAnalyzer));
  }


  //讓線程池更新文檔
  public void updateDocument(Term term, Document doc, Analyzer a) {
    threadPool.execute(new Job(doc, term, a));
  }


  public void close()
      throws CorruptIndexException, IOException {
    finish();
    super.close();
  }


  public void close(boolean doWait)
      throws CorruptIndexException, IOException {
    finish();
    super.close(doWait);
  }


  public void rollback()
            throws CorruptIndexException, IOException {
          finish();
          super.rollback();
        }


        private void finish() {       //關閉線程池
          threadPool.shutdown();
          while(true) {
            try {
              if (threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)) {
                break;
              }
            } catch (InterruptedException ie) {
              Thread.currentThread().interrupt();
              throw new RuntimeException(ie);
            }
          }
        }
      }

如果是多線程寫索引,則讓每個線程使用一個不同的Document,不要在多個線程之間共享同一個Document。

主站蜘蛛池模板: 乃东县| 金山区| 清镇市| 洪雅县| 阿拉善左旗| 德兴市| 新野县| 凌源市| 定陶县| 富蕴县| 泰宁县| 浦县| 黄平县| 南京市| 商丘市| 远安县| 穆棱市| 乾安县| 六安市| 龙游县| 舒兰市| 墨竹工卡县| 繁峙县| 布拖县| 彰化市| 平阴县| 南投市| 丹东市| 陆川县| 陇川县| 和平区| 湖北省| 宜兰市| 盐津县| 上蔡县| 松潘县| 陕西省| 竹山县| 大足县| 上犹县| 南阳市|