Búsqueda de texto completo e índices invertidos en MongoDB

Estoy jugando con MongoDB por el momento para ver qué características interesantes tiene. Creé un pequeño conjunto de pruebas que representa un sistema de blog simple con publicaciones, autores y comentarios, muy básico.

Experimenté con una función de búsqueda que usa la clase MongoRegEx (controlador PHP), donde solo busco en todo el contenido de las publicaciones y los títulos de las publicaciones después de la oración 'lorem ipsum' con distinción entre mayúsculas y minúsculas en "/I".

Mi código se ve así:

$regex = new MongoRegEx('/lorem ipsum/i');  
$query = array('post' => $regex, 'post_title' => $regex);

Pero estoy confundido y aturdido por lo que sucede. Verifico el tiempo de ejecución de cada consulta (configuro el microtiempo antes y después de la consulta y obtengo el tiempo con 15 decimales).

Para mi primera prueba, agregué 110.000 documentos de blog y 5000 autores, todo generado aleatoriamente. Cuando hago mi búsqueda, encuentra 6824 publicaciones con la oración "lorem ipsum" y toma 0.000057935714722 segundos para hacer la búsqueda. Y esto es después de Restablecí el servicio MongoDB (usando Windows) y esto no tiene ningún índice que no sea el predeterminado en _id.

MongoDB usa un índice de árbol B, que definitivamente no es muy eficiente para una búsqueda de texto completo. Si creo un índice en el atributo de contenido de mi publicación, la misma consulta anterior se ejecuta en 0.000150918960571, que curiosamente es más lento que sin ningún índice (más lento con un factor de 0.000092983245849). Ahora bien, esto puede suceder por varias razones porque utiliza un cursor de árbol B.

Pero he tratado de buscar una explicación de cómo puede consultarlo tan rápido. Supongo que probablemente guarda todo en mi RAM (tengo 4 GB y la base de datos tiene unos 500 MB). Es por eso que trato de reiniciar el servicio mongodb para obtener un resultado completo.

¿Puede alguien con experiencia con MongoDB ayudarme a entender qué está pasando con este tipo de búsqueda de texto completo con o sin índice y definitivamente sin índice invertido?

Atentamente - Mestika

preguntado el 03 de mayo de 12 a las 13:05

mongodb regex no usa índices a menos que sea una expresión regular de tipo "comienza con": he tenido cierto éxito al dividir todos los términos en una matriz e indexar eso. Planeo migrar esa solución a Elastic Search (para la parte de búsqueda de texto completo), manteniendo todo en mongo para otros tipos de consultas. Sí, mantendrá sus datos en la RAM si se accede a ellos y tiene memoria libre. -

1 Respuestas

Creo que simplemente no iteras sobre los resultados. Con solo un find(), el controlador no enviar una consulta al servidor. Necesita obtener al menos un resultado para eso. No creo que MongoDB sea tan rápido, y creo que su error está en su punto de referencia.

En segundo lugar, para la búsqueda de expresiones regulares que es no anclado al principio del valor del campo con un ^, no se utiliza ningún índice. deberías jugar con explique() para ver qué está sucediendo realmente.

contestado el 03 de mayo de 12 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.