26

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

  • Elastic 搜索是否成熟到可以用于 Mongodb 全文搜索?我们还将对集合进行分片。Elasticsearch 是否适用于分片集合?

  • 使用 Elasticsearch 或 Solr 的优缺点是什么?

  • MongoDB 是否能够进行全文搜索?

4

7 回答 7

25

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

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

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

  • 易于配置和定制
  • 它有很大的社区(如果您使用开源工具,这真的很有帮助)

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

于 2012-06-13T14:50:19.597 回答
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 world 并尝试使用一些高级功能时真正发生什么。
  • ElasticSearch 方法更简单也更有限,但对某些技术有开箱即用的支持,而 DataImportHandler 似乎更复杂-SQL 友好
  • 在我的 Solr 项目中,我不得不对一些文档使用手动索引,但这主要是因为无法将所需数据非规范化为文档(Solr 项目使用 MySQL)。

Solr 和 ElasticSearch 还有一个新的 MongoDB 连接器,我需要尽快对其进行测试:) http://blog.mongodb.org/post/29127828146/introducing-mongo-connector


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

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

就 MongoDB 本身而言,不,它不支持全文搜索。您可以看到这是一个流行的功能请求:

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

根据我对 MongoDB 的 ES River 插件的了解,它的功能落后于 oplog。由于分片设置将具有多个 oplog,并且无法轻松更改该代码以通过 mongos 连接。

对于 Solr,我看到的示例通常涉及与 ES 插件类似的行为。这里有一些更可靠的信息:

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

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

Solr 与 ElasticSearch

ElasticSearch、Sphinx、Lucene、Solr、Xapian。哪个适合哪个用途?

于 2012-06-13T14:02:14.823 回答
6

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

我建议使用ElasticSearch的 River 功能将文档从 MongoDB 自动推送到 ElasticSearch。

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

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

于 2012-08-17T15:45:20.357 回答
2

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

于 2012-12-07T15:06:18.237 回答
2

目前,在 MongoDB 2.4.6 中,现在在 MongoDB 中提供了全文搜索,并且功能比以前的版本更丰富。在http://docs.mongodb.org/manual/core/text-search/上描述了新功能的能力。

值得一提:

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

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

于 2013-09-28T07:48:17.890 回答
2

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

于 2014-04-30T15:18:00.427 回答