有没有人使用过Lucene.NET而不是使用SQL Server自带的全文搜索?
如果使用过,我很感兴趣了解你如何实现它。
例如,你是否编写了一个Windows服务,每小时查询一次数据库,然后将结果保存到Lucene.NET索引中?
有没有人使用过Lucene.NET而不是使用SQL Server自带的全文搜索?
如果使用过,我很感兴趣了解你如何实现它。
例如,你是否编写了一个Windows服务,每小时查询一次数据库,然后将结果保存到Lucene.NET索引中?
是的,我用它来做你所描述的事情。我们有两个服务 - 一个用于读取,一个用于写入,但只是因为我们有多个读取器。我相信我们可以只用一个服务(即作者)并将阅读器嵌入Web应用程序和服务中。
我使用lucene.net作为一般数据库索引器,因此我得到的基本上是数据库ID(用于索引电子邮件消息),我还使用它获取足够的信息来填充搜索结果或类似内容,而不必触及数据库。在这两种情况下都表现出色,尽管SQL可能会变慢,因为您几乎必须获取ID、选择ID等等。我们通过创建一个临时表(仅包含ID行)并从文件中批量插入(这是来自lucene的输出),然后加入消息表来解决了这个问题。速度更快。
Lucene并不完美,而且您必须在关系数据库框架之外略微思考,因为它根本不是。但它非常擅长自己的工作。值得一看。我被告知,它没有MS SQL的FTI所遇到的“哎呀,抱歉,你需要重新构建索引”的问题。
顺便说一句,我们处理了2000-5000万封电子邮件(以及约100万个唯一附件),总共大约20GB的lucene索引,以及250+GB的SQL数据库和附件。
性能非常好 - 只需确保您考虑并调整合并因素(当它合并索引段时)。拥有多个段没有问题,但如果尝试合并每个段中都有1百万个项目,并且您有一个监视器线程,如果执行时间过长就会终止进程,那么就可能存在BIG问题.....(是的,这让我们受挫了一段时间)。因此,请将每个文档的最大数量保持较低(即,不要像我们一样将其设置为maxint!)
Corey Trager记录了如何在BugTracker.NET中使用Lucene.NET 这里.
我曾经使用过Lucene.net作为存储引擎,因为与数据库相比,用索引来分发和设置备用机器更加容易。只需复制文件系统即可完成索引,您可以在一台机器上进行索引,并将新文件复制到其他机器以分发索引。所有搜索和详细信息都来自Lucene索引,数据库仅用于编辑。我们已经证明了这种设置是非常可扩展的解决方案。
关于SQL Server和Lucene之间的区别,SQL Server 2005全文搜索的主要问题在于该服务与关系引擎分离,因此在性能方面,在全文结果和关系列之间进行连接、排序、聚合和过滤非常昂贵。Microsoft声称这些问题在SQL Server 2008中得到了解决,将全文搜索集成到关系引擎中,但我没有测试过。他们还使整个全文搜索更加透明,在早期版本中,stemmers、stopwords和索引的其他几个部分就像黑匣子一样难以理解,在新版本中更容易看到它们的工作原理。
根据我的经验,如果SQL Server满足您的要求,那么它将是最简单的方法。如果您预计会有很大的增长、复杂的查询或需要对全文搜索进行大量控制,则可能要考虑从一开始就使用Lucene,因为它更容易扩展和个性化定制。
我使用了Lucene.NET和MySQL。我的方法是将数据库记录的主键与索引文本一起存储在Lucene文档中。伪代码如下:
存储记录:
将文本和其他数据插入表中
获取最新插入的ID
创建Lucene文档
将(ID,文本)放入Lucene文档中
更新Lucene索引
查询:
搜索Lucene索引
对于结果集中的每个Lucene文档,通过存储的记录ID从数据库加载数据
值得注意的是,由于其出色的性能,我从Lucene切换到了Sphinx。