2017-09-08 1 views
0

Ich habe einen Index für die db erstellt.

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

jetzt von

dbEmail["emails"].find({$text: {$search: "dogs"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}}) 

auf dem erstellten Index zu suchen, die ich gefunden funktioniert nicht Ich versuche. Die Motordokumentation besagt, dass das Filterargument in db.collection.find (filter) ein SON-Objekt ist. Wenn ich list_indexes() für meine Sammlung ausprobiere, sind es auch SON-Objekte. Aber dann

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

führt auch zu einem Fehler. Wie suchen wir den Index mit dem Motor?

edit:

Meine erste db Sammlung Niel Antwort sieht wie folgt aus:

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

Nach der Indexerstellung (die erstellt wird, habe ich überprüft haben), die endgültigen Ergebnisse, die ich benötige im Gegensatz sollte so etwas wie,

{ "_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 } 

der erste Teil hat eine höhere Punktzahl, weil Hund zweimal im Fach erscheint, auf einmal in dem zweiten.

I überprüft, dass der Index mit dem folgenden Code gültig ist:

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

Die Antwort oder Index ist unten:

('_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}) 
+0

Sie müssen viel spezifischer sein als" funktioniert nicht ". Zeigen Sie einige Daten mit etwas, das voraussichtlich übereinstimmen wird. Zeigen Sie an, dass der erwartete erstellte Index vorhanden und gültig ist. –

+0

@NeilLunn danke, bearbeitet die Frage. – user3407549

+0

Was bekommen Sie eigentlich als Antwort? Du hast das Problem immer noch nicht erklärt. Was ist es? –

Antwort

0

Schließlich gelöst (der Befehl „db.collection.command) "machte es funktioniert,

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

Nein, das ist nicht die Lösung. Die richtige Lösung wäre leicht zu finden gewesen, indem man einfach nach dem "BadYieldError" gesucht hat, den Sie schließlich in Kommentaren als den wesentlichen Teil Ihrer Frage angegeben haben. Sie können auf etwas, das noch keine asynchrone Aktion ist, nicht "nachgeben". –

Verwandte Themen