MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongodb - Indice di testo multiplo:codice di errore troppo grande per la sequenza della chiave dell'indice 67

Il problema con la struttura suggerita:

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

È anche se ora puoi farlo

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

e quindi esegui query come:

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

questo ora restituirà l'intero documento dell'array in cui l'elemento dell'array è abbinato.

Potresti prendere in considerazione l'idea di fare riferimento in modo che ogni risultato della classifica sia un documento separato e le parole chiave e altri metadati siano referenziati, per evitare di ripetere molte informazioni.

Quindi, hai un documento di parole chiave/metadati come:

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

e poi un documento dei risultati come:

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

dove keyword_id rimanda a (riferimenti) alla tabella delle parole chiave/metadati -- ovviamente, in pratica, gli _id saranno simili a "_id":"519817e508a16b447c00020e", ma questo è solo per la leggibilità. Ora puoi indicizzare su keyword_id, dominio e href, insieme o separatamente, a seconda dei tipi di query e non otterrai l'index key pattern too large error e otterrai solo un singolo documento corrispondente anziché un intero array restituito.

Non sono del tutto chiaro su dove hai bisogno di ricerche in stile fuzzy/regex e se cercherai metadati o solo href e dominio, ma penso che questa struttura dovrebbe essere un modo più pulito per iniziare a pensare all'indicizzazione, senza massimizzare gli indici, come prima. Ti consentirà inoltre di combinare i risultati sugli indici normali con gli indici di testo, a seconda del modello di query.

Potresti trovare questa risposta Relazioni MongoDB:incorporare o fare riferimento? utile quando si considera la struttura del documento.