60

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

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

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

4

4 回答 4

59

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

于 2008-08-31T22:11:33.950 回答
3

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

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

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

于 2008-08-31T20:19:19.883 回答
2

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

Regarding the differences between sql server and lucene, the principal problem with sql server 2005 full text search is that the service is decoupled from the relational engine, so joins, orders, aggregates and filter between the full text results and the relational columns are very expensive in performance terms, Microsoft claims that this issues have been addressed in sql server 2008, integrating the full text search inside the relational engine, but I don't have tested it. They also made the whole full text search much more transparent, in previous versions the stemmers, stopwords, and several other parts of the indexing where like a black box and difficult to understand, and in the new version are easier to see how they works.

With my experience, if sql server meet your requirements, it will be the easiest way, if you expect a lot of growth, complex queries or need a big control of the full text search, you might consider working with lucene from the start because it will be easier to scale and personalise.

于 2008-10-23T10:00:56.330 回答
1

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

  • 店铺记录:

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

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

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

于 2008-08-31T22:20:01.013 回答