Хорошая практика lucene и безопасность потока - программирование
Подтвердить что ты не робот

Хорошая практика lucene и безопасность потока

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

index (writer) поиск (поисковик) получить документы по счету (читатель) удалить документы (читатель)

это действие может выполняться несколькими параллельными потоками в одном и том же индексе (с использованием FSDirectory).

ВАЖНОЕ ПРИМЕЧАНИЕ: каждый поток обрабатывает отдельный набор документов, чтобы один поток не касался других документов потока

для этой цели у меня есть несколько вопросов:

1) следует ли использовать один экземпляр (для всех потоков) IndexWriter, IndexReader и IndexSearcher? (они должны быть потокобезопасными)

2) может ли IndexWriter манипулировать индексом, а IndexReader удаляет документы? мне нужно закрыть одно для другого, чтобы сделать свое дело? значение, может ли один поток записывать в индекс, а другой удаляется из него (как я упоминал ранее, я могу гарантировать, что они обрабатывают отдельные наборы данных)

3) любые другие рекомендации и рекомендации, которые могут возникнуть у вас, будут наиболее ценными.

Большое спасибо!

4b9b3361

Ответ 1

IndexWriter, IndexReader и IndexSearcher являются потокобезопасными в соответствии с api javadoc:

ПРИМЕЧАНИЕ: экземпляры IndexSearcher полностью потокобезопасны, что означает несколько потоков могут вызвать любой из своих методов, одновременно

ПРИМЕЧАНИЕ: экземпляры IndexReader полностью потокобезопасны, что означает несколько потоки могут одновременно вызвать любой из своих методов.

ПРИМЕЧАНИЕ: экземпляры IndexWriter полностью потокобезопасны, что означает несколько потоков могут вызвать любой из своих методов, одновременно

Можно открыть только несколько файлов с открытым текстом IndexReader, но лучше использовать один (по соображениям производительности).

Можно открыть только один IndexWriter (и он создаст блокировку записи, чтобы другие не открывались в том же индексе). Вы можете использовать IndexReader для удаления документов, тогда как IndexWriter удерживает эту блокировку. IndexReader всегда будет видеть индекс, как это было в то время, когда он был открыт, изменения, сделанные автором, будут видны только после того, как писатель зафиксирует их, что читатель снова открыт.

Любое число IndexSearcher может быть открыто, но снова лучше поделиться им. Они могут использоваться даже при изменении индекса. Работает так же, как и для IndexReader (изменения не отображаются до тех пор, пока поисковик не будет открыт).