Mysql MongoDB或Solr用于文档摄取、存储和分面搜索?

Mysql MongoDB或Solr用于文档摄取、存储和分面搜索?,mysql,ruby-on-rails,mongodb,solr,Mysql,Ruby On Rails,Mongodb,Solr,我需要在这里为我正在处理的一个项目做一个架构决策。以下是要求: 文档摄取(.doc、.pdf、.csv,可能是视频) 实际文档存储(我假设在服务器上的磁盘上) 数据库中对文件的一些引用)-以及数据库中可搜索和可分面的某些字段 全文文档搜索 分面(基于从文档中收集的字段选择 每个文档的摄入可能不同-换句话说 可能有200个方面,但只有一些适用于每个文档) 我使用rails作为服务器,目前使用mySQL。我相信我至少有两个明显的选择: 索尔;在mySQL中存储文档中的字段,并使用Sunspot ge

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

  • 文档摄取(.doc、.pdf、.csv,可能是视频)

  • 实际文档存储(我假设在服务器上的磁盘上) 数据库中对文件的一些引用)-以及数据库中可搜索和可分面的某些字段

  • 全文文档搜索

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

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

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


    老实说,我对Solr和MongoDB都是新手,我可以在这里使用一些建议,因为我肯定我遗漏了一些优点和缺点。

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

    根据你的需要,我推荐Solr

    我曾在两个不同的web应用程序上使用过搜索问题,第一个,我们从事务数据库中嵌入的Oracle文本切换到Solr。从不回头

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

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

    索尔已经为你做了这一切。它的设计考虑了这些用例,可以非常好地处理面处理,而无需运行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的复杂性。但这就是我所需要的。它是针对类型先行的,因此我不需要刻面,也不需要动态的可过滤字段集,也不需要相关性评分。

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

    根据你的需要,我推荐Solr

    我曾在两个不同的web应用程序上使用过搜索问题,第一个,我们从事务数据库中嵌入的Oracle文本切换到Solr。从不回头

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

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

    索尔已经为你做了这一切。它的设计考虑了这些用例,可以非常好地处理面处理,而无需运行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的复杂性。但这就是我所需要的。它是用于提前输入的,所以我不需要刻面,也不需要动态的可过滤字段集,也不需要相关性评分。

    听起来你可以使用

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

    全文搜索、分面搜索和对许多不同属性的过滤都能很好地工作。信息技术