在mongodb中搜索短语的有效方法是什么



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

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

我想搜索:

search = "a good phone"

使用mongodb有什么技巧吗?或者我使用python中的Knuth-Morris-Pratt字符串匹配(这会杀死服务器)?

MongoDB并没有真正为这样的shannenigan做好准备。我建议您使用SphinxSearch或Solr这样的外部服务来满足您的搜索需求。

您可以使用MapReduce构建搜索索引,然后在生成的集合中进行搜索。

您的map函数会首先将描述拆分为单独的单词。像"a"或"the"这样非常常见的词应该被丢弃。然后它会按单词进行发射Key是单词,而value则是当前处理文档的_id。

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

该MapReduce作业的最终集合将为描述中出现的每个单词包含一个文档。这些文档将包含单词和一个数组,数组中包含单词所在文档的_id。当你添加一个索引时,你可以很快地搜索它。

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

对于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。

这里没有人在搜索时实际引用过文档页面:http://www.mongodb.org/display/DOCS/Full+文本+搜索+in+Mongo

避免像MapReduce和Regex这样无法缩放的方法的一个好方法是在文档中实际存储一组关键字。

你可以决定如何中缀etc单词,以及你想删除哪些停止单词,一旦完成,你只需将其插入文档本身的一个大数组中。

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

不过,我同意其他人的看法,你真的应该研究一下外部FTS技术。我个人很喜欢斯芬克斯:http://sphinxsearch.com/其速度、可扩展性和灵活性。然而,我使用过其他搜索技术,比如Solr,它们都非常好。

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

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

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

最新更新