我收集了大约100万份文件(主要是电影),我在一个字段上创建了一个文本索引。几乎所有搜索都可以正常工作:结果不到20毫秒。例外情况是,当一个人搜索一个非常频繁的术语时,它可以持续长达3000毫秒! 例如,
如果我搜索'纸浆'在集合中(只有40个文件),它持续1ms
如果我搜索电影' (有750 000份文件),它持续3000ms。 在分析请求时,解释(' executionStats')显示所有电影'扫描文件。我尝试了许多索引,排序+限制和提示,但仍然扫描了所有75万个文档,结果仍然很慢......
是否有策略能够更快地在数据库中搜索非常频繁的术语?
答案 0 :(得分:0)
我结束了通过编码这样的事情来做我自己的停用词列表:
import pymongo
from bson.code import Code
# NB max occurences of a word in a collection after what it is considerated as a stop word.
NB_MAX_COUNT = 20000
STOP_WORDS_FILE = 'stop_words.py'
db = connection to the database...
mapfn = Code("""function() {
var words = this.field_that_is_text_indexed;
if (words) {
// quick lowercase to normalize per your requirements
words = words.toLowerCase().split(/[ \/]/);
for (var i = words.length - 1; i >= 0; i--) {
// might want to remove punctuation, etc. here
if (words[i]) { // make sure there's something
emit(words[i], 1); // store a 1 for each word
}
}
}
};""")
reducefn = Code("""function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
};""")
with open(STOP_WORDS_FILE,'w') as fh:
fh.write('# -*- coding: utf-8 -*-\n'
'stop_words = [\n')
result = db.mycollection.map_reduce(mapfn,reducefn,'words_count')
for doc in result.find({'value':{'$gt':NB_MAX_COUNT}}):
fh.write("'%s',\n" % doc['_id'])
fh.write(']\n')