2017-02-19 2 views
0

Ich writitng einen Artikel, dessen Inhalt und Keywords zu einer MongoDB Datenbank Python..now den Benutzer verwendet, kann mir ein Stichwort Ich brauche Artikel zu finden, die Keywords mit ..Pymongo und Artikel im DB

Ich bin wie unten wrting bis DB:

myrecord = {"Link": link, 
      "Title": title, 
      "HeadLine": headline, 
      "BodyText":innerBodyText, 
      "Keywords":keywords, 
      "date": datetime.datetime.utcnow() 
      } 
      try: 
       print("Inserting the record in the DB") 
       result = my_collection.insert_one(myrecord, False) 

Schlüsselwörter ist eine Liste von bnary Tupel

[("africa",3),("content",5),...] 

ich wollte Hacke wissen, über usecases..I zu implementieren neeed alle Datensätze in DB travese Artikel ha finden Ving ein bestimmtes Stichwort

Schreiben Sie unter sehr für dies?

def getArticlesbyKeywords(self,keyword,showBody=False): 
    client = pymongo.MongoClient(
     "mongodb://mahdi:[email protected]:15312,aws-ap-southeast-1-portal.0.dblayer.com:15312/BBCArticles?ssl=true", 
     ssl_cert_reqs=ssl.CERT_NONE) 

    mydb = client['BBCArticles'] 
    my_collection = mydb['Articles'] 
    my_collection.create_index([("Keywords.key", "text")]) 
    print 'Articles containing higher occurences of the keyword is sorted as follow:' 
    for doc in my_collection.find({"$text": {"$search": keyword}}).sort({"score": {"$meta": "textScore"}}): 
     print(doc)) 

ich unten Fehlermeldung erhalten:

Traceback (most recent call last): 
    File "api_access.py", line 21, in <module> 
    api.getArticlesbyKeywords("BBC") 
    File "api_access.py", line 15, in getArticlesbyKeywords 
    for doc in my_collection.find({"$text": {"$search": keyword}}).sort({"score": {"$meta": "textScore"}}): 
    File "C:\Python27\lib\site-packages\pymongo\cursor.py", line 660, in sort 
    keys = helpers._index_list(key_or_list, direction) 
    File "C:\Python27\lib\site-packages\pymongo\helpers.py", line 63, in _index_list 
    raise TypeError("if no direction is specified, " 
TypeError: if no direction is specified, key_or_list must be an instance of list 

Ein Beispieldatensatz in meinem Mongo DB wie folgt lautet:

Keywords: "[{'count': 20, 'key': 'north'}, {'count': 13, 'key': 'image'}, {'count': 13, 'key': 'korean'}, {'count': 10, 'key': 'malaysian'}, {'count': 9, 'key': 'kim'}]" 

Antwort

1

Sie benötigen ein etwas anderes Schema, um diese Daten abfragbar zu machen . Legen Sie eine Reihe von Dokumenten, anstatt eine Reihe von Paaren:

for doc in my_collection.find({"Keywords.key": "africa"}): 
    print(doc) 

Stellen Sie sicher, einen Index erstellen: mehr

my_collection.create_index([("Keywords.key", 1)]) 

Wenn Sie

my_collection.insert_one({ 
    "Keywords": [{"key": "africa", "score": 3}, 
       {"key": "content", "score": 5}] 
}) 

Dann sind Sie wie abfragen anspruchsvolle Abfrage, verwenden Sie einen Textindex:

my_collection.create_index([("Keywords.key", "text")]) 
for doc in my_collection.find(
    {"$text": {"$search": "africa"}} 
).sort({"score": {"$meta": "textScore"}}): 
    print(doc) 

Siehe MongoDB Text Indexes und sort by meta.

+0

Hallo danke für deine Antwort, kann ich es durch höhere Punktzahlen sortieren lassen, wenn ich mein Ergebnis bekomme? – Mehdi

+0

Ja, nach "$ meta" sortieren: "textScore". Ich habe meine Antwort aktualisiert. –

+0

Hallo ich bekomme eine Ausnahme, wenn ich Ihren Code verwende, habe ich meine Frage oben bearbeitet. – Mehdi

0

Verwenden Sie $ elemMatch, um im Array zu suchen.

db.test1.find({"items":{"$elemMatch" : {"$elemMatch": {"$in": ["a"]}}}}) 
{ "_id" : ObjectId("58a9a9805cfd72c8efd8f315"), "name" : "a", "items" : [ [ "a", 1 ], [ "b", 2 ] ] } 

Warum Subdokument nicht wie

keywords: [{ kw: "Afrika", Zahl: 3 }, ...]

dann können Sie nisten verwenden. wie {"keywords.kw": "afrika"} suchen.