1

我需要在这里为我正在处理的项目做出架构决策。以下是要求:

  1. 文档摄取(.doc、.pdf、.csv,也许是视频)

  2. 实际的文档存储(我假设在服务器上的磁盘上,并参考了数据库中的文件) - 以及数据库中可搜索和可分面的某些字段?

  3. 全文文档搜索

  4. 分面(基于从文档摄取中收集的字段选择,每个文档可能不同 - 换句话说,可能有 200 个方面,但只有一些适用于每个文档)

我正在使用 rails 作为服务器,目前使用的是 mySQL。我相信我在这里至少有两个明显的选择:

  1. 索尔; 在 mySQL 中存储文档中的字段,并使用 Sunspot gem 进行 Solr 索引和方面定义。这里的好处似乎是快速搜索、分面、文档摄取实用程序。我不确定我对 200 个(也许更多 - 真正动态定义的)方面的问题。此外,考虑到文档有各种形状和大小,我想知道文档存储机制是否会更好。
  2. MongoDB;使用 mongoid gem 将文档内容存储在 MongoDB 中。我不熟悉这里的文档摄取实用程序,虽然文档存储明显胜出,但我相信 mongodb 在全文搜索方面做得很好,但对于分面,我需要使用多个查询进行聚合,这可能会很慢。

(我也知道我可以将 Solr 与 MongoDB 一起使用,但……不确定)。

老实说,我对 Solr 和 MongoDB 都很陌生,可以在这里使用一些建议,因为我确信我错过了一些优点和缺点。

4

2 回答 2

3

听起来你可以使用elasticsearch

它是一个搜索引擎,使用与 solr 相同的底层 lucene 库,但您在其中存储的所有内容都是 JSON 文档。

全文搜索、分面搜索和对许多不同属性的过滤都运行良好。它确实内置了一些聚合(直方图方面等),尽管您应该检查这些是否符合您的需求。

根据您的弹性和吞吐量需求,构建跨越多台机器的弹性搜索集群也非常容易。

它有几个红宝石绑定,包括由为 elasticsearch 工作的 Karel Minařík 维护的轮胎。

于 2013-03-13T13:33:29.567 回答
2

我对 MongoDB 和 Solr 都有丰富的经验(尽管没有任何关系)。

根据您的需求,我推荐 Solr。

我曾开发过两个有搜索问题的不同 Web 应用程序,第一个是我们从事务数据库中嵌入的 Oracle Text 切换到 Solr。再也没有回头。

尽管 MongoDB 可能可以按照您的要求进行操作,但我怀疑您将花费大量时间使 MongoDB 以您想要的方式运行,尤其是在 faceting 方面。Mongo 的聚合框架相对较新。

您说过您将需要对构面运行多个查询。我希望这不是每个不同值的一个查询,就像所有类别一样,计算每个类别中的产品数量。这在使用开发数据的第一天可能工作得很好,但要等到您同时获得 10,000 个产品和 500 个类别以及 50 个用户搜索。然后,您有 50 个用户同时针对相同数据运行 500 个查询。你最终需要缓存它。

Solr 已经为您完成了这一切。它的设计考虑了这些用例,并且可以非常好地处理分面,而无需运行 N + 1 个查询。Solr 还提供了必要的缓存来避免频繁的磁盘 I/O。Solr 是高度可配置的。您可以调整缓存大小、架构、分析器等,而无需重构代码。

例如,我推荐使用 MongoDB 进行搜索的地方是当您的需求非常小并且不太可能发生重大变化时。例如,如果您想要一个前缀搜索,比如说,预先输入,您可以简单地为每个文档添加一个 searchTokens 字段并自己进行分析。

如果搜索用户集,每个用户可能如下所示:

{
  userId: 'x',
  firstName: 'Brandon',
  lastName: 'Ramirez',
  searchTokens: [
    'b',
    'br',
    'bra',
    'bran',
    'brand',
    'brando',
    'brandon',
    'r',
    'ra',
    'ram',
    'rami',
    'ramir',
    'ramire',
    'ramirez'
  ]
}

我在 MongoDB 中使用了这种技术来避免 Solr 的复杂性。但这就是我所需要的。它用于预先输入,因此我不需要分面,也不需要一组动态的可过滤字段,也不需要相关性评分。

于 2013-03-13T12:53:17.227 回答