配置Lucene.Net与SQL Server的集成。

60

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

如果使用过,我很感兴趣了解你如何实现它。

例如,你是否编写了一个Windows服务,每小时查询一次数据库,然后将结果保存到Lucene.NET索引中?

4个回答

59

是的,我用它来做你所描述的事情。我们有两个服务 - 一个用于读取,一个用于写入,但只是因为我们有多个读取器。我相信我们可以只用一个服务(即作者)并将阅读器嵌入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 这里.


1
我还使用Lucene.NET为Amazon SimpleDB的Simple Savant库添加了全文索引支持。该架构在此处描述:http://simplesavant.codeplex.com/wikipage?title=Full-Text%20Indexing&referringTitle=Documentation - Ashley Tate

3
我还没有对数据库进行操作,你的问题有点开放性。
如果你想搜索数据库,并且可以选择使用Lucene,我猜你也可以控制数据何时插入到数据库中。 如果是这样的话,就没有必要轮询数据库以找出是否需要重新索引,只需在插入时进行索引,或创建一个队列表,该表可用于告诉Lucene应该索引什么。
我认为我们不需要另一个无知地执行任务的索引器,每次都重新索引,或者浪费资源。

2

我曾经使用过Lucene.net作为存储引擎,因为与数据库相比,用索引来分发和设置备用机器更加容易。只需复制文件系统即可完成索引,您可以在一台机器上进行索引,并将新文件复制到其他机器以分发索引。所有搜索和详细信息都来自Lucene索引,数据库仅用于编辑。我们已经证明了这种设置是非常可扩展的解决方案。

关于SQL Server和Lucene之间的区别,SQL Server 2005全文搜索的主要问题在于该服务与关系引擎分离,因此在性能方面,在全文结果和关系列之间进行连接、排序、聚合和过滤非常昂贵。Microsoft声称这些问题在SQL Server 2008中得到了解决,将全文搜索集成到关系引擎中,但我没有测试过。他们还使整个全文搜索更加透明,在早期版本中,stemmers、stopwords和索引的其他几个部分就像黑匣子一样难以理解,在新版本中更容易看到它们的工作原理。

根据我的经验,如果SQL Server满足您的要求,那么它将是最简单的方法。如果您预计会有很大的增长、复杂的查询或需要对全文搜索进行大量控制,则可能要考虑从一开始就使用Lucene,因为它更容易扩展和个性化定制。


1

我使用了Lucene.NET和MySQL。我的方法是将数据库记录的主键与索引文本一起存储在Lucene文档中。伪代码如下:

  • 存储记录:

    将文本和其他数据插入表中
    获取最新插入的ID
    创建Lucene文档
    将(ID,文本)放入Lucene文档中
    更新Lucene索引

  • 查询:

    搜索Lucene索引
    对于结果集中的每个Lucene文档,通过存储的记录ID从数据库加载数据

值得注意的是,由于其出色的性能,我从Lucene切换到了Sphinx


使用这个实现,你是如何管理数据的更新的?你是删除并重新创建 Lucene 索引文件吗?还是安排重新索引,或者是实时的?我问这些问题是为了更好地理解我是否应该使用它。谢谢,deadbug。 - deadbug
@deadbug,我的系统是读取密集型的,我删除了旧的Lucene文档并添加了新的文档。我尝试过调度,但决定保持系统简单。这种方法没有出现性能问题。 - aku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接