public function sphinx_helper() { $this->load->helper("sphinx"); $a = search_wrapper(search("", null, true, 5, 40)); //Obtiene todas las fichas debug(implode(',', $a)); }
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]); }