MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb – Mehrfacher Textindex:Indexschlüsselmuster zu groß, Fehlercode 67

Das Problem mit Ihrer vorgeschlagenen Struktur:

{
 keyword" : "Just an example query", 
 "rankings" :
    [{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
     ...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
 ]}
}

Ist das, obwohl Sie jetzt tun können

db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"}) 

und führen Sie dann Abfragen aus wie:

db.ranking.find({$text:{$search:"example1"}});

dies gibt nun das gesamte Array-Dokument zurück, in dem das Array-Element übereinstimmt.

Möglicherweise möchten Sie eine Referenzierung in Betracht ziehen, sodass jedes Ranking-Ergebnis ein separates Dokument ist und auf die Schlüsselwörter und andere Metadaten verwiesen wird, um zu vermeiden, dass viele Informationen wiederholt werden.

Sie haben also ein Schlüsselwort-/Metadatendokument wie:

{_id:1, "keyword":"example query", "querydate": date, "other stuff":"other meta data"},
{_id:2, "keyword":"example query 2", "querydate": date, "other stuff":"other meta data 2"}

und dann ein Ergebnisdokument wie:

{keyword_id:1, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
... keyword_id:1, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"},
 keyword_id:2, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
 ...keyword_id:2, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"}}

wobei keyword_id auf die Schlüsselwort-/Metadatentabelle zurückverweist (auf diese verweist) – in der Praxis sehen die _ids natürlich wie folgt aus:„_id“ :„519817e508a16b447c00020e“, aber dies dient nur der Lesbarkeit. Sie können jetzt abhängig von Ihren Abfragetypen entweder zusammen oder getrennt nach keyword_id, domain und href indexieren, und Sie erhalten nicht den Fehler index key pattern too large error und Sie erhalten nur ein einziges übereinstimmendes Dokument und nicht ein ganzes Array zurück.

Mir ist nicht ganz klar, wo Sie Fuzzy-/Regex-Suchen benötigen und ob Sie Metadaten oder nur href und Domäne suchen, aber ich denke, diese Struktur sollte eine sauberere Möglichkeit sein, über die Indizierung nachzudenken, ohne die Indizes zu maximieren. wie vorher. Außerdem können Sie Funde in normalen Indizes mit Textindizes kombinieren, abhängig von Ihrem Suchmuster.

Möglicherweise finden Sie diese Antwort MongoDB-Beziehungen:einbetten oder referenzieren? nützlich, wenn Sie die Struktur Ihres Dokuments berücksichtigen.