2010-02-26 5 views
4

У меня была проблема с моим поиском, чтобы не вернуть ожидаемые результаты.Почему мой индекс Lucene заблокирован?

Я пытался бежать от Луки на моем индексе, но он сказал, что это была заперта, и мне нужно Force Разблокировка его (я не джедай/ситх, хотя)

Я попытался удалить папку индекса и беги мое приложение для создания воссоздания, но папка была заблокирована. Используя unlocker, я обнаружил, что есть около 100 записей w3wp.exe (тот же PID, другая Handle) с блокировкой индекса.

Что происходит?

Я делаю это в моей конфигурации NHibernate:

c.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener()); 
c.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener()); 
c.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener()); 

И здесь единственное место, я запрос индекс:

var fullTextSession = NHibernate.Search.Search.CreateFullTextSession(this.unitOfWork.Session); 

var fullTextQuery = fullTextSession.CreateFullTextQuery(query, typeof (Person)); 
fullTextQuery.SetMaxResults(100); 

return fullTextQuery.List<Person>(); 

Что происходит? Что я делаю не так?

Благодаря

+5

вы не можете быть джедаем, но Люк – Midhat

ответ

4

Индекс Lucene.Net только блоки параллельные написать операции по индексу. У вас может быть столько потоков, сколько вам нравится в поиске/чтении из индекса, и они не будут блокироваться - либо друг с другом, либо с кем-либо, кто пишет, однако, если у вас есть два потока, выполняющих запись по индексу в то же время, то есть шанс, что один из них будет блокироваться на другом.

Если lucene сообщает вам, что ваш индекс заблокирован, это означает, что либо кто-то в настоящее время пишет индекс, либо (это звучит скорее), то что-то, что записывалось в индекс, было убито во время записи, и поэтому не удалось удалить замок. Вы должны убедиться, что вы правильно удаляете любые объекты Lucene, которые записываются в индекс, как только они будут выполнены.

Чтобы удалить блокировку вручную, вы должны удалить файл .lock, который необходимо удалить из каталога Lucene (моя большая книга Lucene сейчас не рядом со мной, поэтому я не знаю точно, где она находится, но поиск «блокировки» или «.lock» в каталоге Lucene должен найти его)

Ручки, которые w3wp.exe имел в этом каталоге, были, вероятно, ручками, принадлежащими потокам, читаемым из индекса lucene - хотя это не позволит вам удалить каталог, они не должны мешать вам искать или писать в индекс.

+0

Великий, спасибо за объяснение :) Та часть Thats делают написание является NH.Search FullTextIndexEventListener, вы говорите, что это вероятно, что это не потокобезопасность, и две записи происходят одновременно, а одна из них блокируется, а затем неправильно настроена? –

+0

hmmm, смотрящий на источник, он, кажется, принимает во внимание резьбу (не означает, что его ошибка отсутствует). Любые предложения о том, как я могу отладить это? Я не вижу никакой причины (в моем коде) для индекса писать с ошибкой –

2

Удалить файл "write.lock" в папке индекса.

+3

вопрос: «Почему он заперт?» нет, «скажите мне произвольное, ручное решение» –

+1

Проверьте наличие каких-либо операций записи. Как отметил @ Kragen, более вероятно, что операция записи по индексу завершилась и оставила запись.файл блокировки. Я бы начал с удаления write.lock и посмотреть, будет ли он воссоздан; если это так, то я буду искать процессы, которые обращаются к индексу. – Mikos

Смежные вопросы