Exemple #1
0
 public function sphinx_helper()
 {
     $this->load->helper("sphinx");
     $a = search_wrapper(search("", null, true, 5, 40));
     //Obtiene todas las fichas
     debug(implode(',', $a));
 }
Exemple #2
0
 private function _search($query, $filtros, $op = NULL, $all = FALSE)
 {
     $ci =& get_instance();
     $ci->load->helper("sphinx");
     //Se asume que el filtro no sera una busqueda en texto a menos que este definida la opcion 'palabra'
     $string = "";
     $nonfulltext = true;
     $filters = array();
     //Intento correr Sphinx
     //Defino una nueva variable de filtros que le paso al search(sphinxhelper) usando los filtros que me llegan del optionsHandler
     if (isset($filtros['string']) && $filtros['string'] != '') {
         $string = $filtros['string'];
         $nonfulltext = false;
     }
     if (isset($filtros['hecho'])) {
         $filters['hecho_vida_id'] = array($filtros['hecho']);
     }
     if (isset($filtros['hechoempresa'])) {
         $filters['hecho_empresa_id'] = array($filtros['hechoempresa']);
     }
     if (isset($filtros['etapa'])) {
         $filters['etapa_vida_id'] = array($filtros['etapa']);
     }
     if (isset($filtros['etapa_empresa'])) {
         $filters['etapa_empresa_id'] = array($filtros['etapa_empresa']);
     }
     if (isset($filtros['temas'])) {
         $filters['tema_id'] = $filtros['temas'];
     }
     if (isset($filtros['temas_empresa'])) {
         $filters['tema_empresa_id'] = $filtros['temas_empresa'];
     }
     if (isset($filtros['apoyos'])) {
         $filters['apoyo_estado_id'] = $filtros['apoyos'];
     }
     if (isset($filtros['servicios'])) {
         //Se usa crc32 para transformar el codigo de un servicio a int para poder indexarlo en sphinx.
         //Esto hay que hacerlo con cualquier campo sobre el cual haya que aplicar filtros y no sea un numero.
         $filters['servicio_codigo'] = array_map("crc32", $filtros['servicios']);
     }
     if (isset($filtros['tramites'])) {
         foreach ($filtros['tramites'] as $tramite) {
             $filters[$tramite] = array(1);
         }
     }
     if (isset($filtros['edad'])) {
         //La edad para filtrar no sirve directamente, es necesario obtener los rangos donde la edad esta incluida
         //y luego filtrar por ese set de rangos asociados a las fichas
         $rangos = Doctrine::getTable("RangoEdad")->rangosFromAge($filtros['edad']);
         if ($rangos) {
             $filters['rango_edad_id'] = $rangos;
         } else {
             //Fuerzo el resultado a 0 fichas ya que preguntan por una edad que no posee rangos de edad asociados
             return array($query->having("f.id IN (0)"), TRUE);
         }
     }
     if (isset($filtros['genero'])) {
         $genero = $filtros['genero'];
         switch ($genero) {
             case 1:
                 //Caso ambos (1) busco las fichas marcadas con ambos y las que poseen genero 0 (no asignadas)
                 $genero = array(1, 0);
                 break;
             case 2:
                 //Si me piden un genero particular busco el genero (2), ambos (1), que tambien contienen al genero (2) y también las que no han sido asignadas
                 $genero = array(2, 1, 0);
                 break;
             case 3:
                 //Igual que caso 2
                 $genero = array(3, 1, 0);
                 break;
         }
         $filtros['genero'] = $genero;
         if (!is_array($filtros['genero'])) {
             //Cada variable en filters debe ser un arreglo. Si genero es solo un valor, entonces lo defino como un arreglo de un elemento.
             $filters['genero_id'] = array($filtros['genero']);
         } else {
             $filters['genero_id'] = $filtros['genero'];
         }
     }
     if (isset($filtros['flujo'])) {
         $filters['flujo'] = array($filtros['flujo']);
     }
     /* IMPORTANTE AGREGAR PARA TENER BUENOS RESULTADOS */
     //Esto es un poco feo, ya que la busqueda solo me va a servir para documentos publicados.
     //Deberia ser posible abstraerlo.
     $filters['publicado'] = array(1);
     $filters['maestro'] = array(0);
     /* LIMITO RESULTADOS */
     $limit = 100000;
     //Se define esto ya que Sphinx limita por defecto los resultados, para el caso donde no se define limite se pone un limite alto para escapar el limite de sphinx.
     $offset = 0;
     if (isset($op['limit'])) {
         $limit = $op['limit'];
     }
     if (isset($op['offset'])) {
         $offset = $op['offset'];
     }
     /*
     echo '<br />string: "'.$string.'"<br />'; 
     echo 'filters: '; print_r($filters); echo '<br />';
     echo 'nonfulltext: '.( ($nonfulltext) ? 'true' : 'false').'<br />';
     */
     //debug($filters);
     //Es necesario hacer una llamada para obtener el registro total de las fichas
     // para poder mostrar sólo los filtros de busqueda que existen en el set de fichas obtenidos
     $search_result_total = search($string, $filters, $nonfulltext, 100000, 0);
     //Se llama a la busqueda de sphinx con los parámetros de paginación
     $search_result = search($string, $filters, $nonfulltext, $limit, $offset);
     list($res, $status, $message, $total) = $search_result;
     $temas = isset($filtros['temas']) ? $filtros['temas'] : null;
     $temas_empresa = isset($filtros['temas_empresa']) ? $filtros['temas_empresa'] : null;
     $servicios = isset($filtros['servicios']) ? $filtros['servicios'] : null;
     $edad = isset($filtros['edad']) ? $filtros['edad'] : null;
     $genero = isset($filtros['genero']) ? $filtros['genero'] : null;
     $apoyoss = isset($filtros['apoyos']) ? $filtros['apoyos'] : null;
     //Caso en que esta corriendo sphinx
     //echo '++'.$status.'++<br />';
     if ($status) {
         $fichas = search_wrapper($search_result, TRUE);
         $set_de_fichas = implode(",", array_keys($fichas));
         $q = Doctrine_Manager::getInstance()->getCurrentConnection();
         if ($set_de_fichas) {
             $query->having("f.id IN (" . $set_de_fichas . ")");
             $query->orderBy("FIELD(id," . $set_de_fichas . ")");
         } else {
             $query->having("f.id IN (0)");
         }
     } else {
         //En caso que no este corriendo el demonio searchd, se usan los metodos viejos de filtro :)
         //Busqueda por string
         if (isset($filtros['string']) and !empty($filtros['string'])) {
             $query = $this->_searchString($query, $filtros['string']);
         }
         //Filtros! MUST CHANGE
         $query = $this->_searchFilters($query, $filtros);
     }
     //Se incluye en la respuesta el set total de fichas encontradas
     return array($query, $status, $total, $search_result_total[0]);
 }