索引
在阅读过程中,您会发现索引是使用IndexWriter
类完成的。Lucene 一次只允许IndexWriter
打开 1 个实例。使用默认锁定时,它会在索引目录中创建一个锁定文件并阻止创建任何其他 IndexWriter 实例。出于这个原因,在您可以更好地控制的过程中实现索引可能会更好。
如果您的索引过程因极端偏见而终止并且您的IndexWriter
班级没有关闭,则索引文件夹上的锁定将保持不变,并且不允许其他实例。因此,Lucene 允许您从索引文件夹中解除锁定(使用IndexWriter.unlock
)——这是一种危险的方法,因为如果在同一个索引上打开了两个 IndexWriter,它将破坏索引。如果您有一个正在执行索引的 Windows 服务,并且它是您的解决方案中执行索引(和任何更新)的唯一进程,您可以放心地在服务启动时解锁索引文件夹。在基于 Web 服务的环境中,您从 Web 方法执行索引 - 控制和从锁定问题中恢复会成为问题。
搜索
该类IndexSearcher
用于搜索。这在只读模式下可以从您的基于服务的代码中完成。我认为没有必要为此创建一组单独的 WCF 方法。
优化
可能需要根据卷定期优化索引的性能。再次在单独的过程中建立索引,您可以每晚、每周或任何需要的时间安排优化。优化是通过调用一种方法来完成的。
索引新数据
如何以及何时让索引过程为新数据建立索引……我不知道你在索引什么数据,所以很难说。在我的场景中,我有负责输入数据的 WCF 方法 - 大量。我要求尽快将收到的数据用于搜索。所以,
我的模型层有一个通知层,当成功提交所需类型的新记录时,会在 MSMQ 的本地队列中插入一条简单的通知消息。
MSMQ 的原因是队列是持久的和事务性的,并且即使在系统重新启动崩溃后,其中的任何消息都可用 - 让我永远不会(咳嗽!)丢失任何消息。
索引服务接收通知,构建 LuceneDocument
并对数据进行索引。
还可以通过删除现有索引并爬取 Db 来触发索引服务以执行完整的重新索引。
编辑:
示例架构:
WCF 服务方法将数据提交到模型层。模型层通知侦听客户端在项目上成功发生了 CRUD 操作。侦听客户端在队列中发布通知。
Windows 服务处理数据索引,监视索引请求队列。
ASP.Net 应用程序提供具有搜索功能的用户界面。