Как ускорить одновременное применение Lucene? - PullRequest
1 голос
/ 04 марта 2012

Мои пользователи отправляют в мое приложение документ, который обновляет индекс, и другие пользователи могут запрашивать этот индекс. В отличие от сканеров, индексация является периодической - она ​​индексируется только тогда, когда пользователь отправляет документ. Я ожидаю больше поисков индекса, чем операций записи индекса. (Я не использую Solr, потому что это излишне для моей потребности) и не удаляет и не обновляет проиндексированные документы.

Это мой код для добавления документа в индекс и чтения из индекса. Как я могу оптимизировать это дальше?

public void addDocument(Document doc) throws CorruptIndexException, LockObtainFailedException, IOException{

    IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)).setIndexDeletionPolicy(NoDeletionPolicy.INSTANCE).setRAMBufferSizeMB(256.0);
    TieredMergePolicy tmp = new TieredMergePolicy();
    tmp.setUseCompoundFile(false);
    tmp.setMaxMergedSegmentMB(1000000.0);
    //tmp.setReclaimDeletesWeight(3.0);
    //tmp.setMaxMergedSegmentMB(7000.0);
    iwc.setMergePolicy(tmp);
    // Make sure merges run @ higher prio than indexing:
    final ConcurrentMergeScheduler cms = (ConcurrentMergeScheduler) iwc.getMergeScheduler();
    cms.setMergeThreadPriority(Thread.currentThread().getPriority() + 2);
    cms.setMaxThreadCount(1);
    cms.setMaxMergeCount(4);



    IndexWriter iw = new IndexWriter(directory, iwc);
    iw.addDocument(doc);
    iw.close();
}

Когда приходит поисковый запрос, я создаю новый IndexSearcher следующим образом

public IndexSearcher getIndexSearcher() throws CorruptIndexException, IOException {

        IndexSearcher is= new IndexSearcher(IndexReader.open(directory, false));
        return is;
    }

// Затем я использую поисковик для фактических запросов, не показанных здесь

1 Ответ

10 голосов
/ 04 марта 2012

Держите IndexWriters и IndexReader рядом. Не открывайте нового писателя и не закрывайте его, просто чтобы добавить один документ. Не открывайте новую программу чтения только для ответа на один запрос, вместо этого используйте SearcherManager или NRTManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...