我正在开发一个需要通过搜索做有趣事情的应用程序,包括全文搜索,点击突出显示,分面搜索等...
数据集可能在3000-10000个记录之间,每个记录有20-30个字段,并且全部存储在MySQL中。该网站的流量配置文件很可能是中等规模的。
所有这些要求都可以在MySQL中实现(笨拙地),但在什么时候(就数据大小和流量水平而言)是否值得研究像Solr或Sphinx这样的更集中的技术?
答案 0 :(得分:43)
这个问题需要一个非常广泛的答案,以便在各个方面得到回答。对于特殊用例,有一些非常确定的特定可能使一个系统优于另一个系统,但我想在此处介绍基础知识。
我将完全处理Solr,作为几个功能大致相同的搜索引擎的示例。
我想从一些事实开始:
您不能依赖Solr / Lucene作为安全数据库。有一个事实列表,但它们主要包括缺少恢复选项,缺少酸交易,可能的复杂性等。如果您决定使用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。
如果您没有文本搜索功能,而是可以指向并点击某些内容而不输入文本,那么旧的关系数据库可能是更好的方法。
答案 1 :(得分:5)
Solr像magick一样工作,用于全文索引,这很难用Mysql实现。可以使用Mysql和Solr的混合:用于CRUD操作的Mysql和用于搜索的Solr。我曾与印度最好的房地产在线分类门户网站之一合作,该门户网站使用Solr进行搜索(之前使用的是Mysql)。迁移减少了搜索时间的多样性 Solr可以很容易地与Mysql集成: