Lucene,Sphinx,Postgresql,MySQL?

我正在构建一个Django站点,并且正在寻找一个搜索引擎。

几名候选人:

  • 带Compass / Solr的Lucene / Lucene

  • 狮身人面像

  • Postgresql内置全文搜索

  • MySQl内置全文搜索

  • 选择标准:

  • 结果相关性和排名
  • 搜索和索引速度
  • 易用性和易于与Django集成
  • 资源需求 - 网站将托管在VPS上,因此理想情况下搜索引擎不需要大量RAM和CPU
  • 可扩展性
  • 额外的功能,如“你的意思是?”,相关搜索等
  • 任何对上述搜索引擎或其他引擎不在列表中的搜索引擎有经验的人 - 我很乐意听取您的意见。

    编辑:至于索引需求,随着用户不断输入数据到网站,这些数据将需要不断索引。 它不一定是实时的,但理想情况下,新数据会在指数中显示,延迟时间不会超过15-30分钟


    很高兴看到有人关于Lucene的声音 - 因为我对此一无所知。

    另一方面,狮身人面像,我很清楚,所以让我们看看我能否得到一些帮助。

  • 结果相关性排名是默认值。 您可以根据自己的意愿设置自己的分类,并给予特定领域更高的权重。
  • 索引速度非常快,因为它直接与数据库对话。 任何缓慢都将来自复杂的SQL查询和未索引的外键以及其他此类问题。 我从来没有注意到任何搜索缓慢。
  • 我是Rails的人,所以我不知道用Django实现它有多容易。 尽管如此,Sphinx源代码还是有一个Python API。
  • 搜索服务守护进程(searchd)的内存使用率很低 - 您可以设置索引器进程使用的内存限制。
  • 可伸缩性是我的知识更粗略的地方 - 但将索引文件复制到多台机器并运行多个searchd守护程序非常简单。 我从别人那里得到的一般印象是,它在高负载下非常好,所以在多台机器上扩展它并不是需要处理的事情。
  • 不支持'你的意思'等 - 尽管这些可以用其他工具轻松完成。 狮身人面像通过使用字典来干扰词语,因此在搜索中“驾驶”和“驱动”(例如)将被视为相同。
  • 虽然狮身人面像不允许部分索引更新字段数据。 对此常见的做法是维护一个包含所有最近更改的增量指数,并在每次更改后对其重新进行索引(并且这些新的结果会在一两秒内出现)。 由于数据量小,这可能需要几秒钟的时间。 尽管如此,您仍然需要定期对主要数据集进行重新索引(尽管每隔一小时每隔一段时间,数据的波动性取决于数据的波动性)。 快速索引速度让这一切都非常痛苦。
  • 我不知道这适用于你的情况,但Evan Weaver比较了一些常见的Rails搜索选项(Sphinx,Ferret(Lucene for Ruby的一个端口)和Solr),并运行了一些基准测试。 我想可能是有用的。

    我还没有深入探究MySQL的全文搜索的深度,但我知道它不会与Sphinx,Lucene或Solr进行速度上或功能上的竞争。


    我不知道Sphinx,但对于Lucene与数据库全文搜索,我认为Lucene的性能是无与伦比的。 无论您需要搜索多少条记录,只要您已正确设置Lucene索引,您应该能够在10 ms内完成几乎任何搜索。

    尽管这是最大的障碍:个人而言,我认为将Lucene集成到您的项目中并不容易。 当然,设置它并不难,所以你可以做一些基本的搜索,但是如果你想从中获得最大的性能,那么你肯定需要一本关于Lucene的好书。

    至于CPU和RAM的要求,在Lucene中执行搜索并不会过多地处理你的CPU,虽然索引你的数据是,尽管你不会太频繁地这样做(可能一天一次或两次),所以这不是很多障碍。

    它并没有回答你所有的问题,但总之,如果你有很多数据需要搜索,并且你需要很好的性能,那么我认为Lucene肯定是一条可行的路。 如果你不会有那么多的数据要搜索,那么你不妨去数据库全文搜索。 在我的书中设置MySQL全文搜索一定更容易。


    我很惊讶没有发布关于Solr的更多信息。 Solr与狮身人面像非常相似,但具有更多高级功能(AFAIK,因为我没有使用狮身人面像 - 只能阅读它)。

    下面链接的答案详细介绍了一些关于狮身人面像也适用于Solr的内容。 全文搜索引擎比较 - Lucene,Sphinx,Postgresql,MySQL?

    Solr还提供以下附加功能:

  • 支持复制
  • 多核心(将它们视为具有自己的配置和自己的索引的独立数据库)
  • 布尔搜索
  • 突出显示关键字(如果您有regex-fu,在应用程序代码中相当容易;但是,为什么不让专门的工具为您做得更好)
  • 通过XML或分隔文件更新索引
  • 通过HTTP与搜索服务器进行通信(甚至可以返回Json,Native PHP / Ruby / Python)
  • PDF,Word文档索引
  • 动态字段
  • 聚合字段
  • 阻止单词,同义词等
  • 更多像这样...
  • 使用自定义查询直接从数据库索引
  • 自动建议
  • 缓存Autowarming
  • 快速索引(与MySQL全文搜索索引时间比较) - Lucene使用二进制倒排索引格式。
  • 提高(针对增加特定关键字或短语的相关性的自定义规则等)
  • 部署搜索(如果搜索用户知道他/她想搜索的领域,他们通过键入字段和值,缩小搜索范围,并且只搜索该字段而不是所有内容 - 用户体验好得多)
  • 顺便说一下,有更多的功能吨; 然而,我已经列出了我在生产中实际使用的功能。 顺便说一句,MySQL支持上面列表中的#1,#3和#11(有限)。 对于您正在查找的功能,关系数据库不会削减它。 我会马上消除这些。

    此外,另一个好处是,Solr(实际上,Lucene实际上)是一个文档数据库(例如NoSQL),所以其他文档数据库的诸多好处可以通过Solr实现。 换句话说,你可以使用它不仅仅是搜索(即性能)。 获得创意:)

    链接地址: http://www.djcxy.com/p/38721.html

    上一篇: Lucene, Sphinx, Postgresql, MySQL?

    下一篇: SQLAlchemy: get average of greatest