MongoDB设置的全文搜索选项

时间:2012-06-13 13:28:13

标签: mongodb solr elasticsearch

我们计划在MongoDB中存储数百万个文档,非常需要全文搜索。我读过Elasticsearch和Solr是全文搜索的最佳解决方案。

  • 弹性搜索是否足够成熟,可用于Mongodb全文搜索?我们也在收集分类。 Elasticsearch是否适用于Sharded集合?

  • 使用Elasticsearch或Solr有哪些优点和缺点?

  • MongoDB能否进行全文搜索?

7 个答案:

答案 0 :(得分:25)

MongoDB中有一些搜索功能,但它不像搜索引擎那样功能丰富。

http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo

我们使用Mongo和Solr来搜索内容。我们更喜欢Solr,因为

  • 易于配置和自定义
  • 它有大型社区(如果您使用的是开源工具,这非常有用)

由于我们没有使用ES,所以我不能说太多。您可以在下面的链接中找到关于Solr vs ES的一些讨论。

答案 1 :(得分:22)

我对Solr / MySQL和ElasticSearch / MongoDB都有专业经验。

如果你要查询很多你的搜索引擎,你已经对你的MongoDB进行了分片(我的意思是,如果你想对你的搜索引擎进行分片):你应该使用ElasticSearch,除非你想做什么不能完成ElasticSearch。即使你不打算碎片也应该使用它。

ElasticSearch是一个位于Lucene之上的新项目,它带来了分片机制,从用于分布式环境和搜索的人(Shay Bannon制作Compass并为Gigaspaces工作,数据网格编辑器)。

ElasticSearch和MongoDB一样容易进行分片,我认为它更简单,默认情况下大多数情况都适用。


我不太喜欢Solr。

  • 查询语言根本没有结构(但是插件和Lucene就是这种情况,我认为你也可以使用ES的这种非结构化查询语言)。
  • 我认为没有合适的Solr客户端。 Solr java客户端很糟糕,我听说PHP人员也抱怨,而ElasticSearch Java客户端非常好,更安全,并提供异步支持(如果你使用Netty作为例子,那就太好了)。使用Solr,您将进行大量的字符串连接。
  • 不易扩展
  • 不是那么新的项目,我觉得它有技术部门。 ElasticSearch诞生于Compass,所以我想所有的技术部门都已经被淘汰,以便采用全新的方法。

关于数据导入,我有Solr DataImportHandler和ElasticSearch河流(CouchDB和MongoDB)的经验。我可以告诉你的是:

  • Solr允许做更多的事情,但是采用非结构化的XML方式,并且文档对于理解在你离开hello世界并试图使用一些高级功能之后真正讨厌的东西没有多大帮助。
  • ElasticSearch方法更简单但也有限,但对某些技术提供开箱即用的支持,而DataImportHandler似乎更复杂 - SQL友好
  • 使用我的Solr项目,我不得不对某些文档使用手动索引,但主要是因为不可能将所需数据反规范化为文档(Solr项目使用MySQL)。

还有一个用于Solr和ElasticSearch的新MongoDB连接器,我需要测试asap :) http://blog.mongodb.org/post/29127828146/introducing-mongo-connector


所以最后,我肯定会选择ElasticSearch,因为:

  • 它现在有一个很棒的社区
  • 我认识的许多人都有过类似ElasticSearch的Solr经验
  • 客户端更安全,更结构化,并提供与Java Futures的异步
  • 两者都可以使用新连接器轻松地从MongoDB导入数据
  • 据我所知,它允许做Solr所做的几乎所有事情(根据我的经验,但我不是搜索引擎专家)
  • 它添加了开箱即用的分片
  • 它增加了渗透,可以帮助构建实时可伸缩的应用程序(但您可能需要额外的消息传递技术)
  • 与Solr相比,我阅读的源代码几乎没有技术部门(至少在客户端),并且创建插件似乎很容易。

答案 2 :(得分:7)

就本地MongoDB而言,没有它没有全文搜索支持。您可以看到它是一个受欢迎的功能请求:

https://jira.mongodb.org/browse/SERVER-380

据我所知,MongoDB的ES河流插件,它为其功能提供了oplog。由于分片设置会有多个oplog,并且没有办法轻易地改变代码以通过mongos连接。

同样对于Solr,我见过的例子通常涉及与ES插件类似的行为。这里有一些更加可靠的信息:

http://blog.knuthaugen.no/2010/04/cooking-with-mongodb-and-solr.html

我没有任何使用过的经验,但其他人之前已进行过比较,请看一下:

Solr vs. ElasticSearch

ElasticSearch, Sphinx, Lucene, Solr, Xapian. Which fits for which usage?

答案 3 :(得分:6)

MongoDB无法进行高效的全文搜索。您可以对字段进行通配符搜索,但我认为这些搜索不会有效使用索引。

我建议使用the river functionality的ElasticSearch自动将文档从MongoDB推送到ElasticSearch。

elasticsearch-river-mongodb是一个MongoDB到Elasticsearch的河流,当MongoDB中的文档发生变化时,ElasticSearch将监视oplog,然后自动更新其索引。

这样可以最大限度地减少使两个数据存储保持同步的问题,因为ElasticSearch只是监视Mongo的复制表。

答案 4 :(得分:2)

Mongo不适合全文搜索。 显然,您需要为字段编制索引以便快速搜索,并且包含BIG数据(长字符串)的索引字段将在mongo中失败。它对索引的限制为1k,如果你的内容超过1k,它将被索引忽略,并且不会显示在你的搜索结果中。很明显,如果你试图对你的文章进行全文搜索,mongo不是一个好的选择。

答案 5 :(得分:2)

目前,在MongoDB 2.4.6中,现在有一个MongoDB中的全文搜索,它在以前的版本中功能更丰富。在http://docs.mongodb.org/manual/core/text-search/上描述了新功能的功能。

值得一提:

  
      
  • 在索引创建和文本命令执行期间标记并限制搜索项。为每个
  • 文档分配一个分数   
  • 包含索引字段中的搜索字词。分数确定文档与给定搜索查询的相关性。
  •   

但是,在这个答案(从2013年9月)https://stackoverflow.com/a/18631775/1920149你可以看到,mongo仍然警告在生产中使用这个功能。此功能仍处于测试阶段。

答案 6 :(得分:2)

通过在必填字段上创建文本索引,从版本2.6开始,可以在Mongodb的产品环境中进行全文搜索。 indexe text in mongodb

相关问题