如何使用motor在MongoDB上进行$text搜索?

2024-10-01 04:59:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我为数据库创建了一个索引。在

res = yield dbEmail["emails"].create_index([("subject", pymongo.TEXT)])

现在我试图通过

^{pr2}$

我发现它不起作用。马达文档在数据库.集合.查找(filter)是子对象。当我在我的集合中尝试list_indexes()时,它们也是子对象。但后来呢

for index in (yield dbEmail["emails"].list_indexes()):
    searchResults = yield dbEmail["emails"].find(index)

也会导致错误。我们如何用马达在索引上搜索$文本?在

编辑:回复Niel

我的初始数据库收集如下所示:

emails = {"_id" : ObjectId("xxcxcdsfas"),"subject": "Joe owns a dog", "content": "Dogs are man's best friend", "likes": 60, "year": 2015,"language": "english"},
         {"_id" : ObjectId("xxcxcdsfas"),"subject": "Dogs eat cats and dog eats pigeons too", "content": "Cats are not evil", "likes": 30, "year": 2015,"language": "english"},
         {"_id" : ObjectId("xxcxcdsfas"),"subject": "Cats eat rats", "content": "Rats do not cook food", "likes": 55, "year": 2014, "language": "english"},
         {"_id" : ObjectId("xxcxcdsfas"), "subject": "Rats eat Joe", "content": "Joe ate a rat", "likes": 75, "year": 2014, "language": "english"} 

在创建索引(正在创建,我已经验证过)之后,我需要的最终结果应该是:

{ "_id" : ObjectId("xxcxcdsfas"), "subject" : "Dogs eat cats and dog eats pigeons too", "content" : "Cats are not evil", "likes" : 30, "year" : 2015, "language" : "english", "score" : 1 }
{ "_id" : ObjectId("xxcxcdsfas"), "subject" : "Joe owns a dog", "content" : "Dogs are man's best friend", "likes" : 60, "year" : 2015, "language" : "english", "score" : 0.6666666666666666 }

第一个有更高的分数,因为狗在主题中出现两次,而在第二个主题中出现一次。在

我检查了索引是否有效,代码如下:

    for item in (yield dbEmail["emails"].index_information()).items():
        print(item)

响应或索引如下:

('_id_', {'v': 2, 'key': [('_id', 1)], 'ns': 'emailInfo.emails'})
('subject_text', {'v': 2, 'key': [('_fts', 'text'), ('_ftsx', 1)], 'ns': 'emailInfo.emails', 'weights': SON([('subject', 1)]), 'default_language': 'english', 'language_override': 'language', 'textIndexVersion': 3})

Tags: idindexenglishcontentyearlanguagesubjectobjectid
1条回答
网友
1楼 · 发布于 2024-10-01 04:59:58

最后解决了,命令“数据库.集合.命令()“成功了

searchResults = yield dbEmail.command({"find": "emails",
                                      "filter": {"$text": { "$search": "dogs"}}})

相关问题 更多 >