【问题标题】:Configure Lucene.Net with SQL Server使用 SQL Server 配置 Lucene.Net
【发布时间】:2008-08-31 19:53:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server lucene.net


    【解决方案1】:

    是的,我已经将它用于您所描述的内容。我们有两种服务——一种用于读取,一种用于写入,但这仅仅是因为我们有多个阅读器。我确信我们可以只使用一项服务(编写器)并将阅读器嵌入 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。

    【讨论】:

    • 我还使用 Lucene.NET 为 Amazon SimpleDB 的 Simple Savant 库添加了全文索引支持。架构描述如下:simplesavant.codeplex.com/…
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        • 店铺记录:

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

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

        请注意,我从 Lucene 切换到了 Sphinx,因为它具有出色的性能

        【讨论】:

        • Aku,通过这个实现,您如何管理数据更新?您是否为 Lucene 索引删除并重新创建文件?你安排重新索引还是实时的?我问这些问题是为了更好地理解我是否应该使用它。谢谢,死虫。
        • @deadbug,我的系统是读取密集型的,我删除了旧的 lucene 文档并添加了新文档。我尝试了调度,但决定保持系统简单。这种方法没有性能问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 2013-12-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多