【问题标题】:How does one do a $text search on MongoDB with motor? [duplicate]如何使用电机在 MongoDB 上进行 $text 搜索? [复制]
【发布时间】:2017-09-08 07:00:35
【问题描述】:

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

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

现在我正在尝试通过

搜索创建的索引
dbEmail["emails"].find({$text: {$search: "dogs"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})

我发现它不起作用。电机文档说 db.collection.find(filter) 中的 filter 参数是一个 SON 对象。当我在我的集​​合上尝试 list_indexes() 时,它们也是 SON 对象。但是后来

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

也会导致错误。我们如何使用电机在索引上进行 $text 搜索?

编辑:回复尼尔

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

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})

【问题讨论】:

  • 您需要比“不起作用”更具体。显示一些预期匹配的数据。显示预期创建的索引存在且有效。
  • @NeilLunn 谢谢,编辑了问题。
  • 那么你实际上得到了什么作为回应?你还没有解释问题。这是什么?
  • @NeilLunn 它说“tornado.gen.BadYieldError: yielded unknown object MotorCursor()”,我确定我犯了语法错误,但是我在电机文档或其他文件中找不到合适的
  • @NeilLunn 我需要在数据库中搜索我正在尝试上述方法的 $text,

标签: python mongodb tornado tornado-motor


【解决方案1】:

终于解决了,命令“db.collection.command()”让它工作了,

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

【讨论】:

  • 不,这不是解决方案。只需查找您最终在 cmets 中声明的 BadYieldError 作为您问题的重要部分,就很容易找到正确的解决方案。你不能 yield 处理实际上还不是异步操作的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2021-01-18
相关资源
最近更新 更多