使用SQL Server配置Lucene.Net

使用SQL Server配置Lucene.Net

Configure Lucene.Net with SQL Server

有人使用Lucene.NET而不是使用SQL Server附带的全文本搜索吗?

如果是这样,我会对您如何实现它感兴趣。

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


是的,我已经将它完全用于您所描述的内容。我们有两种服务-一种用于读取,一种用于写入,但这仅是因为我们有多个读者。我确定我们只用一项服务(编写器)就可以完成,并将阅读器嵌入到Web应用程序和服务中。

我已经使用lucene.net作为一般的数据库索引器,所以我得到的基本上是数据库ID(用于索引电子邮件),并且我还使用它来获取足够的信息以在不接触数据库的情况下填充搜索结果等。在这两种情况下,它的工作都很好,但是SQL可能会变慢,因为您几乎必须获得一个ID,选择一个ID等。我们通过制作一个临时表(仅在ID中包含ID行)来解决此问题。它),然后从文件(这是Lucene的输出)中进行大容量插入,然后加入到消息表中。快很多了。

Lucene并不是完美的,并且您必须在关系数据库之外进行一些思考,因为它完全不是一个数据库,但是它的作用非常出色。值得一看,而且我被告知没有MS SQL的FTI遇到的"糟糕,抱歉,您需要再次重建索引"问题。

顺便说一句,我们正在处理205,000万封电子邮件(以及大约100万个唯一附件),我认为总共有20GB的Lucene索引和250 GB的SQL数据库附件。

至少可以说,

性能很棒-只需确保您考虑并调整合并因子(合并索引段时)。一个以上的段没有问题,但是如果您尝试合并两个段,每个段有100万个项目,并且观察者线程会花费很长时间杀死进程,那么可能会出现BIG问题。 ..(是的,这把我们踢了一会儿)。因此,将每个东西的最大文档数保持为低(即,不要像我们一样将其设置为maxint!)

EDIT Corey Trager在此处记录了如何在BugTracker.NET中使用Lucene.NET。


我尚未针对数据库完成此操作,您的问题还很开放。

如果您要搜索数据库,并且可以选择使用Lucene,那么我还猜想您可以控制何时将数据插入到数据库中。
如果是这样,则几乎没有理由轮询数据库以查找是否需要重新索引,只需在插入时进行索引,或创建可用于告诉lucene要进行索引的队列表。

我认为我们不需要另一个对它的操作一无所知的索引器,而不必每次都重新索引或浪费资源。


我还使用lucene.net作为存储引擎,因为它比使用数据库更容易分发和设置带有索引的备用计算机,它只是文件系统副本,您可以在一台计算机上建立索引,并且只需将新文件复制到其他计算机上以分发索引。所有搜索和详细信息都从lucene索引中显示,该数据库仅用于编辑。该设置已被证明是可满足我们需求的非常可扩展的解决方案。

关于sql server和lucene之间的区别,sql server 2005全文搜索的主要问题是该服务与关系引擎分离,因此在全文结果和关系列之间进行联接,订购,聚合和过滤从性能上讲,它们是非常昂贵的,Microsoft声称此问题已在sql server 2008中解决,将全文搜索集成在关系引擎中,但我尚未对其进行测试。他们还使整个全文搜索变得更加透明,在以前的版本中,词干提取器,停用词以及索引的其他几个部分(如黑匣子)难以理解,而在新版本中,则更容易看到它们的工作方式。

根据我的经验,如果sql server满足您的要求,这将是最简单的方法,如果您期望大量的增长,复杂的查询或需要对全文本搜索进行较大的控制,则可以考虑使用lucene从开始,因为它将更易于扩展和个性化。


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

  • 商店记录:

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

  • 查询
    搜索lucene索引
    对于结果集中的每个Lucene文档,通过存储记录的ID

    从数据库加载数据

请注意,由于性能出色,我从Lucene切换到Sphinx


推荐阅读