Lucene.Net和SQL Server

有没有人使用Lucene.NET而不是使用SQL Server自带的全文search?

如果是的话,我会对你如何实现它感兴趣。

你有没有例如写一个Windows服务,每小时查询数据库,然后将结果保存到lucene.net索引?

是的,我用它来描述你正在描述的内容。 我们有两个服务 – 一个用于读取,另一个用于写入,但仅仅是因为我们有多个读取器。 我相信我们可以用一种服务(作者)完成它,并将读者embedded到Web应用程序和服务中。

我已经使用lucene.net作为一般的数据库索引器,所以我回来的基本上是数据库ID(索引电子邮件消息),我也用它来获取足够的信息来填充search结果等,而不用触摸数据库。 在这两种情况下,它都工作得很好,因为SQL可能会稍微慢一点,因为你几乎必须得到一个ID,select一个ID等。我们通过创build一个临时表(只有ID行)和从文件(这是lucene的输出)批量插入,然后join到消息表。 速度更快

Lucene不是完美的,你必须在关系数据库框外面思考一下,因为它并不是一个,但是它非常擅长它。 值得一看,据我所知,没有“哎呀,对不起,你需要再次重build索引”MS SQL的FTI所做的问题。

顺便说一下,我们正在处理2000-5000万个电子邮件(和大约100万个独立附件),我认为总计大约20GB的lucene索引,以及250 + GB的SQL数据库+附件。

performance太棒了,至less可以说 – 只要确保你考虑和调整你的合并因素(合并索引段)。 有多个分段没有问题,但如果您尝试合并两个分段中有1mil项目的分段,则会出现BIG问题,而且如果分段时间过长,您将有一个观察器线程杀死进程… (是的,这踢了我们的屁股一段时间)。 所以请保持每件东西的最大文件数量(即,不要像我们那样将其设置为maxint)!

编辑Corey Tragerlogging了如何在BugTracker.NET中使用Lucene.NET。

我还没有对数据库做到这一点,你的问题是开放的。

如果你想search一个数据库,并可以select使用Lucene,我也猜测你可以控制何时将数据插入到数据库中。 如果是这样的话,几乎没有什么理由去查询数据库,以确定是否需要重新索引,只需插入索引,或者创build一个可以用来告诉lucene索引的队列表。

我认为我们不需要另外一个对它正在做的事情一无所知的索引器,并且每次都重新索引,或者浪费资源。

我也使用lucene.net作为存储引擎,因为使用索引比使用数据库更容易分发和设置备用机器,它只是一个文件系统副本,您可以在一台机器上索引,并将新文件复制到其他机器上分配索引。 所有的search和详细信息都显示在lucene索引中,数据库仅用于编辑。 这个设置已经被certificate是一个满足我们需求的非常可扩展的解决scheme。

关于sql server和lucene的区别,sql server 2005全文search的主要问题是服务与关系引擎是分离的,所以在全文结果和关系列之间的连接,sorting,聚集和过滤是非常昂贵的在性能方面,微软声称这个问题已经在sql server 2008中解决了,整合了关系引擎中的全文search,但是我没有经过testing。 他们还使整个全文search更加透明,在以前的版本中,词干,停用词和索引的其他部分就像一个黑盒子,难以理解,在新版本中更容易看到它们是如何工作的。

根据我的经验,如果sql server满足你的要求,这将是最简单的方法,如果你期望很多的增长,复杂的查询或需要一个全文search的大控制,你可能会考虑从一开始就使用lucene,因为它将更容易扩展和个性化。

我使用了Lucene.NET和MySQL。 我的做法是将DBlogging的主键与索引文本一起存储在Lucene文档中。 在伪代码中,它看起来像:

  • 存储logging:

    插入文本,其他数据到表中
    获取最新插入的ID
    创buildlucene文件
    把(ID,文本)放入lucene文件更新lucene索引

  • 查询
    searchlucene索引
    对于结果集中的每个lucene文档,通过存储的loggingID从DB加载数据

只是要注意,由于它的卓越性能,我从Lucene切换到狮身人面像

我认为这篇文章是一个很好的起点:

http://www.aspfree.com/c/a/braindump/working-with-lucene-net/