【发布时间】:2008-08-31 19:53:14
【问题描述】:
有没有人用过Lucene.NET而不是用sql server自带的全文搜索?
如果是这样,我会对您如何实现它感兴趣。
例如,您是否编写了一个每小时查询数据库然后将结果保存到 lucene.net 索引的 Windows 服务?
【问题讨论】:
标签: sql-server lucene.net
有没有人用过Lucene.NET而不是用sql server自带的全文搜索?
如果是这样,我会对您如何实现它感兴趣。
例如,您是否编写了一个每小时查询数据库然后将结果保存到 lucene.net 索引的 Windows 服务?
【问题讨论】:
标签: sql-server lucene.net
是的,我已经将它用于您所描述的内容。我们有两种服务——一种用于读取,一种用于写入,但这仅仅是因为我们有多个阅读器。我确信我们可以只使用一项服务(编写器)并将阅读器嵌入 Web 应用程序和服务中。
我使用 lucene.net 作为通用数据库索引器,所以我得到的基本上是 DB id(用于索引的电子邮件),我还使用它来获取足够的信息来填充搜索结果等无需接触数据库。它在这两种情况下都很好用,虽然 SQL 可能会有点慢,因为你几乎必须获得一个 ID,选择一个 ID 等。我们通过制作一个临时表(其中只有 ID 行)来解决这个问题,并且从文件中批量插入(它是 lucene 的输出),然后加入到消息表中。快了很多。
Lucene 并不完美,您必须跳出关系数据库的框框思考一下,因为它完全不是一个,但它非常擅长它的功能。值得一看,而且,有人告诉我,它没有 MS SQL 的 FTI 会出现的“糟糕,抱歉,您需要再次重建索引”的问题。
顺便说一句,我们处理了 20-5000 万封电子邮件(以及大约 100 万个独特的附件),我认为总共大约 20GB 的 lucene 索引,以及 250+GB 的 SQL 数据库 + 附件。
至少可以说,性能非常棒 - 只需确保您考虑并调整您的合并因素(当它合并索引段时)。拥有多个段没有问题,但是如果你尝试合并两个段,每个段有 100 万个项目,并且你有一个观察线程,如果它花费的时间太长,它就会终止进程...... ..(是的,这让我们大吃一惊)。因此,将每个事物的最大文档数保持在 LOW(即,不要像我们那样将其设置为 maxint!)
编辑 Corey Trager 在 BugTracker.NET here 中记录了如何使用 Lucene.NET。
【讨论】:
我还没有对数据库做过,你的问题有点开放。
如果你想搜索一个db,并且可以选择使用Lucene,我也猜想你可以控制何时将数据插入数据库。 如果是这样,几乎没有理由轮询 db 以确定是否需要重新索引,只需在插入时进行索引,或创建可用于告诉 lucene 要索引的内容的队列表。
我认为我们不需要另一个不知道自己在做什么的索引器,并且每次都重新索引,或者浪费资源。
【讨论】:
我也使用 lucene.net 作为存储引擎,因为它比数据库更容易分发和设置具有索引的备用机器,它只是一个文件系统副本,您可以在一台机器上建立索引,只需将新文件复制到其他机器分配索引。所有的搜索和详细信息都显示在 lucene 索引中,数据库仅用于编辑。这种设置已被证明是一种非常可扩展的解决方案,可以满足我们的需求。
关于sql server和lucene的区别,sql server 2005全文搜索的主要问题是服务与关系引擎解耦,所以全文结果和关系列之间的连接、排序、聚合和过滤在性能方面非常昂贵,微软声称这个问题已经在 sql server 2008 中得到解决,在关系引擎中集成了全文搜索,但我没有测试过。他们还使整个全文搜索更加透明,在以前的版本中,词干分析器、停用词和索引的其他几个部分就像黑盒子一样难以理解,而在新版本中更容易看到它们是如何工作的。
根据我的经验,如果 sql server 满足您的要求,这将是最简单的方法,如果您期望大量的增长、复杂的查询或需要对全文搜索有很大的控制,您可以考虑使用来自开始,因为它更容易扩展和个性化。
【讨论】:
我使用 Lucene.NET 和 MySQL。我的方法是将数据库记录的主键与索引文本一起存储在 Lucene 文档中。在伪代码中它看起来像:
店铺记录:
在表格中插入文本、其他数据
获取最新插入的 ID
创建 lucene 文档
将 (ID, text) 放入 lucene 文档
更新lucene索引
查询
搜索 lucene 索引
对于结果集中的每个 lucene 文档,通过存储的记录 ID 从 DB 加载数据
请注意,我从 Lucene 切换到了 Sphinx,因为它具有出色的性能
【讨论】: