代码之家  ›  专栏  ›  技术社区  ›  corydoras

在Tomcat中使用Lucene

  •  1
  • corydoras  · 技术社区  · 16 年前

    背景

    我假设以下代码是完全线程安全的:

    // Called from a servlet when a user action results in the index needing to be updated
    public static void rebuildIndex() {
    FSDirectory dir = new NIOFSDirectory(new File(Configuration.getAttachmentFolder()), null);
    IndexWriter w = new IndexWriter(dir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
    .... build index ...
    w.optimize();
    w.commit();
    w.close();
    }
    

    从搜索servlet调用以下代码:

    // Called by the search servlet
    public void search() {
    FSDirectory dir = new NIOFSDirectory(new File(Configuration.getAttachmentFolder()), null);
    IndexReader indexReader = IndexReader.open(dir,true);
    IndexSearcher searcher = new IndexSearcher(indexReader);
    .... do the search ...
    }
    

    问题

    我正在努力找出实现这一点的最佳/正确方法,以避免多线程问题:

    1. 应该 FSDirectory dir 对象是否共享为某种静态变量?
    2. 应该 IndexSearcher searcher IndexReader indexReader 对象存储为静态变量,然后在重建索引时简单替换?
    2 回复  |  直到 16 年前
        1
  •  1
  •   Murali VP    16 年前

    您应该将indexreader和searcher移动到rebuildIndex()的末尾,当然,在rebuildIndex()和search()中同步搜索器。但根据重建索引的频率和返回搜索结果的速度,您可能需要考虑缓存indexreader和searcher,而不是每次重建索引时等待的搜索线程。

        2
  •  1
  •   bajafresh4life    16 年前

    每当有人执行搜索时,打开新的indexsearcher和indexreader效率非常低。最好有一个由所有search()调用共享的读卡器。每当需要重建索引时,都会关闭并替换此读卡器实例。当然,这需要同步。详细说明如下:

    http://wiki.apache.org/lucene-java/UpdatingAnIndex