Использование lucene в Tomcat - PullRequest
1 голос
/ 11 ноября 2009

Фон

Я предполагаю, что следующий код является полностью потокобезопасным:

// 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();
}

Следующий код вызывается из поискового сервлета:

// 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 ]

1 голос
/ 11 ноября 2009

Открытие новых IndexSearcher и IndexReader всякий раз, когда кто-то выполняет поиск, очень неэффективно. Лучше всего иметь одного читателя, который будет использоваться всеми вызовами search (). Этот экземпляр читателя закрывается и заменяется всякий раз, когда вам нужно перестроить индекс. Конечно, это нужно будет синхронизировать. Это разработано больше в:

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

1 голос
/ 11 ноября 2009

Вы должны просто переместить indexReader и поисковик в конец rebuildIndex () и, конечно же, синхронизироваться с поисковиком в rebuildIndex () и search (). Но исходя из того, как часто нужно перестраивать индекс и как быстро возвращать результаты поиска, вам, возможно, придется рассмотреть вопрос о некотором кэшировании indexReader и поисковика, а не потоков поиска, ожидающих каждый раз, когда перестраивается индекс.

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