有人使用 Lucene.NET 而不是使用 sql server 自带的全文搜索吗?

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

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

有帮助吗?

解决方案

是的,我已经将它用于您所描述的用途。我们有两种服务 - 一种用于读取,一种用于写入,但这只是因为我们有多个读取器。我确信我们可以只用一项服务(编写器)来完成此任务,并将阅读器嵌入到网络应用程序和服务中。

我使用 lucene.net 作为通用数据库索引器,所以我得到的基本上是 DB id(索引电子邮件),并且我还使用它来获取足够的信息来填充搜索结果等,而无需触及数据库。它在这两种情况下都工作得很好,尽管 SQL 可能会有点慢,因为你几乎必须获取 ID、选择 ID 等。我们通过创建一个临时表(其中仅包含 ID 行)并从文件(这是 lucene 的输出)批量插入,然后加入消息表来解决这个问题。速度快了很多。

Lucene 并不完美,您必须跳出关系数据库的框框进行思考,因为它完全不是完美的,但它非常擅长它的功能。值得一看,而且据我所知,它不会像 MS SQL 的 FTI 那样出现“哎呀,抱歉,您需要再次重建索引”的问题。

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

至少可以说,性能非常棒 - 只要确保您考虑并调整您的合并因素(当它合并索引段时)。拥有多个段没有问题,但如果您尝试合并两个段,每个段都有 100 万个项目,并且您有一个观察者线程,如果花费太长时间,它会终止进程,则可能会出现大问题... ..(是的,这让我们很恼火一段时间)。因此,请将每个事物的最大文档数保持在较低水平(即,不要像我们那样将其设置为 maxint!)

编辑 Corey Trager 记录了如何在 BugTracker.NET 中使用 Lucene.NET 这里.

其他提示

我还没有对数据库做过,你的问题有点开放。

如果你想搜索一个数据库,并且可以选择使用Lucene,我也猜你可以控制何时将数据插入数据库。如果是这样,就没有理由轮询数据库来确定是否需要重新索引,只需在插入时建立索引,或者创建一个可用于告诉 lucene 要索引什么的队列表。

我认为我们不需要另一个索引器,它不知道自己在做什么,并且每次都重新索引,或者使用浪费的资源。

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

关于sql server和lucene之间的区别,sql server 2005全文搜索的主要问题是该服务与关系引擎解耦,因此全文结果和关系列之间的连接、排序、聚合和过滤非常昂贵在性能方面,微软声称这个问题已经在sql server 2008中得到解决,将全文搜索集成到关系引擎中,但我没有测试过。他们还使整个全文搜索更加透明,在以前的版本中,词干分析器、停用词和索引的其他几个部分就像黑匣子一样难以理解,而在新版本中更容易看到它们是如何工作的。

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

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

  • 存储记录:

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

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

请注意,我从 Lucene 切换到 狮身人面像 由于其卓越的性能

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top