1

搜索包含不完全匹配的单词的短语的最佳方法是什么,例如:

description = "a cell phone that have an external memory"

我想搜索:

search = "a good phone"

是否有使用 mongodb 的提示,或者我是否使用来自 python 的 Knuth-Morris-Pratt 字符串匹配(这会杀死服务器)?

4

6 回答 6

4

MongoDB 并不是真正适合这样的骗子。我建议您使用SphinxSearchSolr等外部服务来满足您的搜索需求。

于 2012-09-14T21:56:46.573 回答
3

您可以使用MapReduce构建搜索索引,然后在结果集合中搜索。

您的 map 函数将首先将描述拆分为单个单词。应该丢弃非常常见的单词,例如“a”或“the”。然后它会对每个单词进行一次发射。是单词,是当前处理的文档的_id。

然后,您的 reduce 函数将用于收集包含每个单词的所有文档。它将返回所有数组合并为一个并删除重复项的键。

然后,此 MapReduce 作业的结果集合将包含描述中出现的每个单词的一个文档。这些文档将包含单词和一个数组,其中包含它出现的文档的_id。添加索引时,您可以非常快速地搜索它。

此 MapReduce 作业需要执行一次以构建搜索索引。当数据库中已经有大量数据时,这将需要一段时间。每当添加或删除文档或更改文档描述时,您都必须执行增量 MapReduce 以更新搜索索引。这种增量 MapReduce 将比初始的快得多,因此自动执行该操作应该是可行的。

于 2012-09-14T22:31:04.833 回答
2

这里没有人真正参考过搜索的文档页面:http ://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo

避免无法扩展的方法(例如 Map Reduce 和 Regex)的一个好方法是在您的文档中实际存储一组关键字。

您将决定如何添加等词以及要删除哪些停用词,一旦完成,您只需将其推入文档本身的一个大数组中。

Map reduce 有时被认为是一种不好的方法,因为它不会出于性能和线程原因以及正则表达式,因为它在 90% 的情况下对索引的使用非常糟糕,除非有前缀。我已经看到一个简单的正则表达式杀死了很多 mongodb 服务器,所以我知道它是多么糟糕。

我确实同意其他所有人的观点,尽管您应该真正研究外部 FTS 技术。我个人很喜欢 Sphinx:http ://sphinxsearch.com/ ,因为它的速度、可扩展性和灵活性。但是,我使用了其他搜索技术,例如 Solr,它们都非常好。

于 2012-09-14T23:43:27.650 回答
1

只想为Elastic Search添加一个插件。他们有大量的客户端库,包括几个用于 python 的。

Solr 和 ElasticSearch 都是基于 Apache Lucene 构建的,但 ElasticSearch 相对于 Solr、IMO 有一些优势,首先是它使用 JSON 而不是 XML。

于 2012-09-14T22:00:04.483 回答
1

对于 mongo db 字段的简单正则表达式搜索,您可以使用find查询"$regex"表达式。

在 pymongo 那将是db.your_collection.find({"description": {"$regex": "<insert regex here>"}}).

这会让你开始。正如其他人所说,MongoDB 不一定喜欢你这样打败它。您可能需要考虑更强大的解决方案来进行大量搜索。

请考虑在您的数据库中进行正则表达式搜索的性能影响。

在此处阅读 MongoDB 参考资料http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

于 2012-09-14T22:42:38.850 回答
0

mongo 3.0+:只需在带有短语的字段上使用文本索引。 https://docs.mongodb.org/v3.0/core/index-text/

于 2015-12-21T10:05:49.313 回答