有没有办法提高MongoDB的全文本搜索性能?

时间:2019-11-28 22:09:39

标签: mongodb mongodb-query full-text-search

我正在使用MongoDB Atlas来提供约11万个运动员数据。

每个文档包含一个name字段和一个name_foreign字段,该字段的名称使用不同的语言,而MongoDB的全文本搜索不支持该名称。 在我的Python应用程序中,我使用Pymongo根据球员的英语和外语名称返回搜索结果。我创建了一个索引,以便可以根据搜索查询对搜索结果进行评分。

db.players.create_index([ ("name", TEXT), ('name_foreign', TEXT) ])

在我的Python应用程序中,我检测到输入字符串,无论何时使用其他语言,我都会对该字符串进行标记,然后将其输入到find查询中(数据库中的name_foreign字段是已被标记化,以便进行全文搜索。

我的GET播放器端点

try:
    # transform query if it's non-eng
    if detect(name) == '...': # some language
        query = ''
        for ch in name:
            if ch != ' ':
                query += ch + ' '
        query = query.rstrip()
    else:
        query = name
    players = list(db.players.find({ "$text": { "$search": query }},
                { 'score': { "$meta": "textScore" }}))
    players.sort(key = lambda k: (k['score'], k['reputation']), reverse = True)
    # Return results based on the input query
    return jsonify({ 'result': [player_to_dict(player) for player in players][:4]})

except: ...

我终于返回搜索结果的前4位。 这在英语上很好用,而全文本搜索则很好用。但是,当我使用另一种语言时,它对短名称有效,但是当名称变长时,它崩溃了,这给我造成了内存泄漏错误。

2019-11-28T21:51:47.301318+00:00 heroku[web.1]: Process running mem=799M(156.2%)
2019-11-28T21:51:47.301318+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)

当数据低于10k时,此方法效果很好。现在大约有11万,我似乎需要一种更好的方法。

我对这种东西还是陌生的,我真的很想听听经验丰富的MongoDB用户的想法,并最终使它更好地工作。

谢谢!

0 个答案:

没有答案