何时考虑使用Solr

40

我正在开发一个应用程序,需要在搜索方面做一些有趣的事情,包括全文搜索、命中高亮显示、分面搜索等等...

数据集可能在每个记录20-30个字段的范围内达到3000-10000条,并且全部存储在MySQL中。网站的流量规模可能比较小型。

所有这些要求都可以通过MySQL来实现(但不太灵活),那么在数据量和访问量何时时机成熟,值得考虑更专注的技术,像Solr或Sphinx?


5
别忘了阅读 http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/ :) (注:该网页为 Stack Overflow 官方博客,介绍了 Stack Overflow 搜索引擎的优化) - bzlm
3个回答

49

这个问题需要全面回答以涵盖所有方面。虽然有某些特定情况可能使一个系统在特殊用例下更优秀,但我想在这里介绍基础知识。

我将完全以Solr为例进行讨论,因为它和其他大多数搜索引擎的工作方式基本相同。

我想先从一些硬性事实开始:

  • 你不能把Solr/Lucene作为安全数据库来依赖。原因有很多,但主要是因为缺少恢复选项、缺乏ACID事务、可能存在复杂性等。如果你决定使用Solr,则需要从另一个来源(如SQL表)填充索引。实际上,Solr非常适合存储包含来自多个表和关系的数据的文档,否则将需要构建复杂的连接。

  • Solr/Lucene提供了惊人的文本分析/词干/全文搜索得分/模糊函数。这些功能MySQL无法实现。实际上,在MySQL中,全文搜索仅限于MyIsam,并且得分非常简单和有限。对字段进行加权、根据特定指标提高文档的重要性、根据短语接近度、匹配准确性等对结果进行得分是非常困难的,甚至几乎不可能。

  • 在Solr/Lucene中,你有文档。你不能真正存储关系和处理。当然,你可以索引其他文档的键,并将其存储在某些文档的多值字段中,这样你就可以实际存储1:n关系并且双向进行以获取n:n,但这会增加数据开销。不要误解,它非常适用于许多用途(例如某些产品目录,你想存储产品的分销商,并仅搜索某些分销商有货的商品),但对于HAS / HAS NOT这类情况,你几乎无法执行类似“获取所有在至少3家分销商处有货的产品”的操作。

  • Solr/Lucene拥有非常好的分面功能和搜索后分析功能。例如:在一个具有40000个结果的广泛搜索之后,您可以显示如果您将搜索细化为具有此字段此值和该字段该值的组合,则只会获得3个结果。需要在MySQL中进行额外查询的内容可以高效且方便地完成。

  • 那么让我们总结一下

    • Lucene的强大之处在于文本搜索/分析。由于反向索引结构,它的速度也惊人地快。您可以进行大量的后处理并满足其他需求。尽管它是面向文档的,并且没有像三元存储器中的SPARQL那样的“图形查询”,但是基本的N:M关系可以进行存储和查询。如果您的应用程序专注于文本搜索,除非您有很好的理由(例如非常复杂的多维范围过滤器查询),否则您应该肯定选择Solr/Lucene。

    • 如果您没有文本搜索,而是某种可以指向并单击某些内容而不输入文本的内容,那么传统的关系数据库可能是更好的选择。


    2
    这是全面的答案...我要补充的一件事是,MySQL + SOLR是一个出色的组合,原因如上所述。有许多方法可以从MySQL中获取数据到SOLR中,您可能需要进行研究。一旦您看到facets的强大作用,我无法想象在MySQL驱动的网站上不提供SOLR搜索服务。 - nickdos

    11

    如果您:

    • 不想给数据库造成压力。
    • 需要进行真正的全文搜索。
    • 希望获得闪电般快速的搜索结果。

    目前我在维护一个新闻网站,每月有500万用户访问量。我们使用MySQL作为主要数据存储系统,Solr作为搜索引擎。


    5
    Solr对于全文索引非常强大,而这是使用Mysql难以实现的。可以将Mysql和Solr混合使用:Mysql用于CRUD操作,而Solr用于搜索。
    我之前曾在印度最好的房地产在线分类广告门户网站之一工作过,该网站使用Solr进行搜索(之前使用Mysql)。这次迁移使搜索时间大大缩短。
    Solr可以很容易地与Mysql集成:
    • Solr Full Dataimport可用于从Mysql表中导入数据到Solr集合。
    • 可以定期安排Solr Delta import来从Mysql加载最新数据到Solr集合。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接