MongoDB 设置的全文搜索选项
Posted
技术标签:
【中文标题】MongoDB 设置的全文搜索选项【英文标题】:Full text search options for MongoDB setup 【发布时间】:2012-06-16 11:17:12 【问题描述】:我们计划在 MongoDB 中存储数百万个文档,并且非常需要全文搜索。我读过 Elasticsearch 和 Solr 是全文搜索的最佳可用解决方案。
Elastic 搜索是否成熟到可以用于 Mongodb 全文搜索?我们还将对集合进行分片。 Elasticsearch 是否适用于 Sharded 集合?
使用 Elasticsearch 或 Solr 的优缺点是什么?
MongoDB 是否能够进行全文搜索?
【问题讨论】:
【参考方案1】:从 2.6 版开始,通过在必填字段上创建文本索引,可以在产品环境中使用 Mongodb 进行全文搜索。 indexe text in mongodb
【讨论】:
【参考方案2】:目前,在 MongoDB 2.4.6 中,现在在 MongoDB 中提供了全文搜索功能,并且比以前的版本更丰富。在http://docs.mongodb.org/manual/core/text-search/ 上描述了新功能的功能。
值得一提:
在索引创建和文本命令执行期间对搜索词进行标记和阻止。为每个文档分配一个分数 包含索引字段中的搜索词。分数决定了文档与给定搜索查询的相关性。
但是,在这个答案(从 2013 年 9 月开始)https://***.com/a/18631775/1920149 中,您可以看到,mongo 仍然警告不要在生产中使用此功能。此功能仍处于测试阶段。
【讨论】:
【参考方案3】:我在 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,因为:
它现在拥有一个很棒的社区 我认识的很多人都使用过 ElasticSearch 等 Solr 客户端更安全且结构化,并提供与 Java Futures 的异步 两者都可以通过新的连接器轻松地从 MongoDB 导入数据 据我所知,它几乎可以完成 Solr 所做的所有事情(根据我的经验,但我不是搜索引擎专家) 它添加了开箱即用的分片 它增加了渗透,有助于构建实时可扩展的应用程序(但您可能需要额外的消息传递技术) 与 Solr 相比,我阅读的源代码几乎没有技术部门(至少在客户端),而且创建插件似乎很容易。【讨论】:
【参考方案4】:MongoDB 有一些搜索功能,但功能不如搜索引擎丰富。
http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo
我们使用 Mongo 和 Solr 使内容可搜索。我们更喜欢 Solr,因为
易于配置和定制 它拥有庞大的社区(如果您使用开源工具,这真的很有帮助)由于我们没有与 ES 合作,所以我不能说太多。您可以在下面的链接中找到一些关于 Solr 与 ES 的讨论。
Solr vs ES 1 Solr vs ES 2 Solr vs ES 3【讨论】:
谢谢帕文。你的帖子很有帮助。 “不如搜索引擎高效”...我会说“不如搜索引擎功能丰富。” Mongo 多键搜索效率还不错,但缺少搜索引擎中存在的功能。 感谢您的警告。将其更新为功能丰富。 目前在最新的dev mongoblog.mongodb.org/post/40513621310/…有实验性全文搜索@【参考方案5】:Mongo 不适合全文搜索。 显然,您需要索引字段以进行快速搜索,并且在 mongo 中索引包含 BIG 数据(长字符串)的字段将失败。它的索引限制为 1k,如果您的内容超过 1k,它将被索引忽略并且不会显示在您的搜索结果中。显然,如果您尝试对文章执行全文搜索,那么 mongo 并不是一个好的选择。
【讨论】:
【参考方案6】:MongoDB 无法进行高效的全文搜索。您可以对字段进行通配符搜索,但我认为这些使用索引效率不高。
我建议使用 ElasticSearch 的the river functionality 自动将文档从 MongoDB 推送到 ElasticSearch。
elasticsearch-river-mongodb 是一条 MongoDB 到 Elasticsearch 的河流,当 MongoDB 中的文档发生变化时,ElasticSearch 会监控 oplog,然后自动更新其索引。
这最大限度地减少了保持两个数据存储同步的问题,因为 ElasticSearch 只是监控 Mongo 的复制表。
【讨论】:
许多开发人员评论说regexp searches have been quite efficient,即使是 100k 文档。【参考方案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 vs. ElasticSearch
ElasticSearch, Sphinx, Lucene, Solr, Xapian. Which fits for which usage?
【讨论】:
只是想知道为什么 ES 会“将您绑定到亚马逊服务”? 哇——我把 ES 和 EB 混淆了——我的错,会编辑——+1 以发现我的愚蠢:) 感谢大家的cmets。以上是关于MongoDB 设置的全文搜索选项的主要内容,如果未能解决你的问题,请参考以下文章