搜索具有不匹配的词组的短语的最佳方法是什么,例如:
description = "a cell phone that have an external memory"
我想搜索:
search = "a good phone"
是否有使用mongodb的提示,或者我使用python中的Knuth-Morris-Pratt字符串匹配(会杀死服务器)?
答案 0 :(得分:4)
MongoDB并不适合这种shannenigans。我建议您使用SphinxSearch或Solr等外部服务来满足您的搜索需求。
答案 1 :(得分:3)
您可以使用MapReduce构建搜索索引,然后搜索生成的集合。
您的地图功能会首先将描述拆分为单个单词。应该丢弃像“a”或“the”这样的常用词。然后它会按字发出。 键是单词,值是当前处理文档的_id。
然后,您的reduce函数将用于收集包含每个单词的所有文档。它将返回密钥,所有数组合并为一个并删除重复项。
此MapReduce作业的结果集合将包含一个文档,用于描述中显示的每个单词。这些文档将包含单词和一个数组,其中包含出现的文档的_id。添加索引时,您可以非常快速地进行搜索。
此MapReduce作业需要执行一次才能构建搜索索引。当数据库中已有大量数据时,这需要一段时间。每当添加或删除文档或更改文档描述时,您都必须执行增量MapReduce来更新搜索索引。这个增量MapReduce将比初始MapReduce快得多,因此自动执行此操作应该是可行的。
答案 2 :(得分: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这样的其他搜索技术,它们都非常好。
答案 3 :(得分:1)
只想添加Elastic Search的插件。它们有client libraries吨,包括几个用于python。
Solr和ElasticSearch都是基于Apache Lucene构建的,但ElasticSearch比Solr,IMO有一些优势,首先是它使用JSON而不是XML。
答案 4 :(得分:0)
对于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。