Хорошая практика Lucene и безопасность потоков - PullRequest
17 голосов
/ 16 января 2012

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

индекс (писатель) -> поиск (искатель) -> получить документы по счету (читатель) -> удалить документы (читатель)

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

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

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

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

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

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

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

1 Ответ

32 голосов
/ 16 января 2012

IndexWriter, IndexReader и IndexSearcher являются поточно-ориентированными в соответствии с API Java:

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

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

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

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

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

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

...