【发布时间】:2019-11-28 22:09:39
【问题描述】:
我正在使用 MongoDB Atlas 来提供大约 110k 的运动员数据。
每个文档都包含一个 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 时,此方法效果很好。现在它有大约 110k,看来我需要一个更好的方法来做到这一点。
我是这种东西的新手,我真的很想听听有经验的 MongoDB 用户的一些想法,并最终让它更好地工作。
提前致谢!
【问题讨论】:
-
不太清楚你在for循环中试图做什么,但我建议你在将
query传递给mongo之前查看它的值,以确保你是不要把空格放在错误的地方。
标签: mongodb mongodb-query full-text-search