sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb - Índice de texto múltiple:patrón de clave de índice demasiado grande código de error 67

El problema con la estructura sugerida:

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

Es que aunque ahora puedes hacerlo

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

y luego ejecutar consultas como:

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

esto ahora devolverá todo el documento de la matriz donde coincide el elemento de la matriz.

Es posible que desee considerar hacer referencia para que cada resultado de clasificación sea un documento separado y se haga referencia a las palabras clave y otros metadatos, para evitar repetir mucha información.

Entonces, tiene un documento de palabra clave/metadatos como:

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

y luego un documento de resultados como:

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

donde keyword_id se vincula de nuevo a (referencias) la tabla de palabras clave/metadatos; obviamente, en la práctica, los _id se verán como "_id":"519817e508a16b447c00020e", pero esto es solo por legibilidad. Ahora puede indexar en keyword_id, dominio y href, ya sea juntos o por separado, según sus tipos de consulta y no obtendrá el index key pattern too large error y solo obtendrá un único documento coincidente en lugar de una matriz completa devuelta.

No tengo del todo claro dónde necesita búsquedas de estilo fuzzy/regex y si buscará metadatos o solo href y dominio, pero creo que esta estructura debería ser una forma más limpia de comenzar a pensar en la indexación, sin maximizar los índices. como antes. También le permitirá combinar búsquedas en índices normales con índices de texto, según su patrón de consulta.

Puede encontrar esta respuesta Relaciones de MongoDB:¿insertar o hacer referencia? útil al considerar la estructura de su documento.