为什么我的Lucene索引被锁定?

And*_*ock 4 lucene nhibernate

我的搜索出现问题,未返回预期的结果。

我尝试对索引运行Luke,但是它说它已被锁定,我需要强制解锁它(尽管我不是Jedi / Sith)

我试图删除索引文件夹并运行我的recreate-indicies应用程序,但该文件夹已锁定。使用解锁器,我发现大约有100个w3wp.exe条目(相同的PID,不同的句柄)在索引上具有锁定。

这是怎么回事?

我正在NHibernate配置中执行此操作:

c.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener());
c.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener());
c.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener());
Run Code Online (Sandbox Code Playgroud)

这是我查询索引的唯一位置:

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

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

return fullTextQuery.List<Person>();
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我究竟做错了什么?

谢谢

Jus*_*tin 5

Lucene.Net索引仅阻止对该索引的并发操作。您可以根据需要从搜索索引中读取/读取任意数量的线程,并且它们不会阻塞-彼此之间或在进行写入的任何人身上,但是,如果您有两个线程同时在索引上进行写入,则有他们中的一个会阻塞另一个的机会。

如果lucene告诉您您的索引已被锁定,则意味着当前正在有人正在对该索引进行写操作,或者(听起来更可能是)正在写该索引的某个内容在写过程中被杀死,因此无法删除该锁。 您应该确保在完成处理后立即正确处理所有写入索引的Lucene对象。

要手动删除锁,需要在Lucene目录中删除一个.lock文件(我的Lucene大书目前不在我身边,所以我不知道确切位置在哪里,而是进行搜索。 Lucene目录中的“ lock”或“ .lock”应该找到它)

w3wp.exe在此目录上具有的句柄可能是线程从lucene索引读取的句柄-尽管这些将阻止您删除目录,但不应阻止您搜索或写入索引。