MongoDB:在搜索非常频繁的术语时进行慢速文本搜索

时间:2017-07-19 16:22:18

标签: mongodb

我收集了大约100万份文件(主要是电影),我在一个字段上创建了一个文本索引。几乎所有搜索都可以正常工作:结果不到20毫秒。例外情况是,当一个人搜索一个非常频繁的术语时,它可以持续长达3000毫秒! 例如,

如果我搜索'纸浆'在集合中(只有40个文件),它持续1ms

如果我搜索电影' (有750 000份文件),它持续3000ms。 在分析请求时,解释(' executionStats')显示所有电影'扫描文件。我尝试了许多索引,排序+限制和提示,但仍然扫描了所有75万个文档,结果仍然很慢......

是否有策略能够更快地在数据库中搜索非常频繁的术语?

1 个答案:

答案 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')