MongoRegex y busca varias filas en la colección

Lo que me gustaría hacer es lo siguiente.

$collection = $this->db->products_sale;

        $user_query = preg_replace("/[[:blank:]]+/"," ", $data);
        $arr_query = explode(' ', $user_query);

        if (count($arr_query) > 1) {
        $tmp = array();

        foreach ($arr_query as $q) {
            $tmp[] = new MongoRegex( "/". $q ."/i" );
        }

        $who['keywords'] = array('$in' => $tmp);
        $who['title'] = array('$in' => $tmp);
        $who['description'] = array('$in' => $tmp);

        } else {
            $who['keywords'] = new MongoRegex( "/". $user_query ."/" );
            $who['title'] = new MongoRegex( "/". $user_query ."/" );
            $who['description'] = new MongoRegex( "/". $user_query ."/" );
        }

        print json_encode($who);
        $cursor = $collection->find( $who );

Como pueden ver estoy haciendo varias busquedas, lo que me gustaria hacer es lo siguiente necesito poder buscar palabras clave, titulo, descripcion

Ahora podría hacer una serie de búsquedas, que es lo que pensé que estaba haciendo, pero claramente no. por lo que obtuve, parece que envía una cadena larga ARRAY o JSON de regreso a mongoDB, a diferencia de MySQL, donde puede hacer una búsqueda OR/AND e incluso una búsqueda MATCH, parece que MongoDB no es tan inteligente.

Esto es lo que encontré que funciona, pero luego busca la forma exacta en que la búsqueda busca, por ejemplo

Se buscaría "Windows Phone 7" en lugar de palabras clave.

$cursor = $collection->find( 
        array('$or' => array(
        array("keywords" => new MongoRegex( "/$user_query/i" )),
        array("product" => new MongoRegex( "/$user_query/i" )),
        array("description" => new MongoRegex( "/$user_query/i" )),
        )));

preguntado el 01 de julio de 12 a las 12:07

1 Respuestas

Para cualquiera que quiera saber cómo terminé haciendo que funcionara. Fue bastante simple. Todavía estoy trabajando en ello, pero esto es lo que tengo hasta ahora.

$collection = $this->db->products_sale;

    $user_query = preg_replace("/[[:blank:]]+/"," ", $data);
    $arr_query = explode(' ', $user_query);

    if (count($arr_query) > 1) {
    $tmp = array();

    foreach ($arr_query as $q) {
        $tmp[] = new MongoRegex( "/". $q ."/i" );
    }

    $who['keywords'] = array('$in' => $tmp);
    $who['product'] = array('$in' => $tmp);

    } else {
        $who['keywords'] = new MongoRegex( "/". $user_query ."/" );
        $who['product'] = new MongoRegex( "/". $user_query ."/" );
    }

    //print json_encode($who);
    $cursor = $collection->find( 
    array('$or' => array($who
    )));


    if ($cursor->count() > 0)
    {
    //print "found you";
    $test = array();
    // iterate through the results
    while( $cursor->hasNext() ) {   
        $test[] = ($cursor->getNext());
    }
    print json_encode($test);

Respondido 01 Jul 12, 13:07

Dependiendo de la cantidad de datos que planee agregar, sospecho que el rendimiento se convertirá rápidamente en un problema. Las expresiones regulares múltiples (y no ancladas) no usarán un índice. Ver el notas sobre expresiones regulares. Un mejor enfoque sería indexar sus documentos usando un Enfoque de búsqueda de texto completo contra una lista de palabras clave extraídas o para usar un motor de búsqueda de texto completo que proporcionaría funciones de búsqueda más ricas y puntuación de relevancia. - Stennie

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