有没有人使用过Lucene.NET而不是使用sql server附带的全文搜索?
如果是这样,我会对你如何实现它感兴趣。
您是否编写了一个每小时查询数据库的Windows服务,然后将结果保存到lucene.net索引?
答案 0 :(得分:57)
是的,我已将它用于您所描述的内容。我们有两个服务 - 一个用于读取,一个用于写入,但仅仅因为我们有多个读者。我确信我们可以通过一个服务(作者)完成它,并将读者嵌入到Web应用程序和服务中。
我使用lucene.net作为通用数据库索引器,所以我得到的基本上是DB id(对于索引的电子邮件消息),我也用它来获取足够的信息来填充搜索结果等没有触及数据库。它在两种情况下都很有用,因为SQL可以变得有点慢,因为你几乎必须得到一个ID,选择一个ID等。我们通过创建一个临时表(只有ID行)来解决这个问题。从文件批量插入(这是lucene的输出)然后加入到消息表。更快。
Lucene并不完美,你必须在关系数据库框之外稍微思考一下,因为它完全不是一个,但它非常擅长它的作用。值得一看,而且,据我所知,没有“哎呀,抱歉,你需要重新建立你的索引”问题,这是MS SQL的FTI所做的。
BTW,我们处理了2千万到5千万封电子邮件(以及大约100万个独特的附件),我认为总共约有20GB的lucene索引,以及250 + GB的SQL数据库+附件。性能非常好,至少可以说 - 只需确保您考虑并调整合并因素(合并索引段时)。拥有多个段没有问题,但是如果你尝试合并两个每个都有1mil项的段,并且你有一个观察者线程,如果它需要太长时间就会终止这个过程,那么可能会有一个大问题... ..(是的,这踢了我们的屁股一段时间)。因此,保持每个东西的最大文件数量为低(即,不要像我们那样将其设置为最大值!)
EDIT Corey Trager记录了如何在BugTracker.NET here中使用Lucene.NET。
答案 1 :(得分:3)
我还没有针对数据库做过,你的问题有点开放。
如果你想搜索数据库,并且可以选择使用Lucene,我还猜你可以控制何时将数据插入数据库。 如果是这样,没有理由轮询数据库以确定是否需要重新索引,只需在插入时进行索引,或创建一个队列表,该表可用于告诉lucene要索引的内容。
我认为我们不需要另一个不知道它在做什么的索引器,每次都重新索引,或者浪费资源。
答案 2 :(得分:2)
我也使用lucene.net作为存储引擎,因为它更容易分发和设置索引而不是数据库的备用机器,它只是一个文件系统副本,你可以在一台机器上索引,只需将新文件复制到分配索引的其他机器。所有搜索和详细信息都显示在lucene索引中,数据库仅用于编辑。此设置已被证明是一种可扩展的解决方案,可满足我们的需求。
关于sql server和lucene之间的区别,sql server 2005全文搜索的主要问题是服务与关系引擎分离,因此在全文结果和关系列之间进行连接,排序,聚合和过滤在性能方面非常昂贵,微软声称这个问题已在sql server 2008中得到解决,在关系引擎中集成了全文搜索,但我没有测试过它。他们还使整个全文搜索更加透明,在以前的版本中,词干分析器,停用词和索引的其他几个部分就像黑盒子一样难以理解,而在新版本中更容易看出它们是如何工作的。
根据我的经验,如果sql server符合您的要求,那将是最简单的方法,如果您期望大量增长,复杂查询或需要对全文搜索进行大量控制,您可以考虑使用lucene来自开始是因为它更容易扩展和个性化。
答案 3 :(得分:1)
我认为这篇文章是一个很好的起点:
http://www.aspfree.com/c/a/braindump/working-with-lucene-net/
答案 4 :(得分:1)
我使用Lucene.NET和MySQL。我的方法是在Lucene文档中存储db记录的主键以及索引文本。在伪代码中,它看起来像:
商店记录:
将文本,其他数据插入表格中
获取最新插入的ID
创建lucene文件
将(ID,文本)放入lucene文档中
更新lucene指数
查询
搜索lucene指数
对于结果集中的每个lucene doc,按存储记录的ID
请注意,由于性能卓越,我从Lucene切换到Sphinx