Viewing file: class_search.php (14.15 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
class search {
function search ($string, $tipo, $inicio, $num_res, $x_y, $user, $link, $and)
{
$this->STRING = $string;
$this->TIPO = $tipo;
// Search BGOV Power for PORTEL 2.0
// Writed by: Nicolás Rey, 2005
// Función de búsqueda basada en numeros de palabras registradas, encontradas, valores y proximidad
///////////////////////////////////////////////////////////////////////////////////////////////////
// 0. Diferenciación entre objetivos de búsqueda
// 1, Se usa para contenido, 2, para documentos, 3, archivo, 4 categorias
if ($this->TIPO == 1) {
$tipo_label = "Contenidos Activos";
$tipo_seleccion = "links_id";
$tipo_tabla = "contenido_links";
$tipo_campos = array(0 => 'links_nombre', 1 => 'links_descripcion', 2 => 'links_texto');
$tipo_valor_campos = array(0 => '3', 1 => '2', 2 => '1');
$tipo_show_campos = "links_nombre, links_descripcion, links_link";
if ($x_y != "") {
$tipo_link = "contenido_links_administracion.php?x_y=$x_y&user=$user&id_app=21&accion=-1&links_id=";
$and = $and;
}else{
$tipo_link = "frame_detalle_2.php?h_id=";
$and = " and (links_tipo_id=1 or links_tipo_id=2 or links_tipo_id=4)";
}
}
if ($this->TIPO == 2) {
$tipo_label = "Documentos";
$tipo_seleccion = "foto_id";
$tipo_tabla = "contenido_foto_y_medios";
$tipo_campos = array(0 => 'foto_nombre', 1 => 'foto_descripcion', 2 => 'foto_pie');
$tipo_valor_campos = array(0 => '3', 1 => '2', 2 => '1');
$tipo_show_campos = "foto_nombre, foto_descripcion, foto_formato";
if ($x_y != "") {
$tipo_link = "contenido_foto_y_medios_administracion.php?x_y=$x_y&user=$user&id_app=19&accion=-1&foto_id=";
$and = "";
}else{
$tipo_link = "contenido_foto_y_medios_administracion.php?x_y=$x_y&user=$user&id_app=19&accion=-1&foto_id=";
$and = "";
}
}
if ($this->TIPO == 4) {
$tipo_label = "Catgorias";
$tipo_seleccion = "categoria_id";
$tipo_tabla = "contenido_categoria";
$tipo_campos = array(0 => 'categoria_tema_desc');
$tipo_valor_campos = array(0 => '3');
$tipo_show_campos = "categoria_tema_desc, categoria_tema_id";
if ($x_y != "") {
$tipo_link = "contenido_categoria_administracion.php?x_y=$x_y&user=$user&id_app=18&accion=-1&categoria_id=";
$and = "";
}else{
$tipo_link = "contenido_categoria_administracion.php?x_y=$x_y&user=$user&id_app=18&accion=-1&categoria_id=";
$and = "";
}
}
//echo "Esto es lo que voy a buscar: " . $string;
// 1. Generación de arreglos
// Inicializar el arreglo
$results[1] = "No se encontraron resultados";
// 1.0 Normaliza la búsqueda y crea la opción de pasar un valor encerrado entre comillas como una consulta válida
// para páginas posteriores
$string_back = str_replace("\"", "//", $string);
$string_back = str_replace("\\", "", $string_back);
// 1.1 Extrae las palabras en un arreglo llamado palabras
// Detecta si hay un más (+), "", (-) ó espacios
$literal = substr_count($this->STRING, '\"');
$literal_1 = substr_count($this->STRING, '\\');
$literal_2 = substr_count($this->STRING, '\'');
$literal_3 = substr_count($this->STRING, '//');
if (($literal + $literal_1 + $literal_2 + $literal_3) > 0) {
$this->STRING = str_replace("\"", "", $this->STRING);
$this->STRING = str_replace("\'", "", $this->STRING);
$this->STRING = str_replace("\\", "", $this->STRING);
$this->STRING = str_replace("//", "", $this->STRING);
$palabras[0] = $this->STRING;
}else{
$this->STRING = str_replace("+", "//", $this->STRING);
$this->STRING = str_replace("-", "//", $this->STRING);
$this->STRING = str_replace(" ", "//", $this->STRING);
$this->STRING = str_replace("%20", "//", $this->STRING);
$palabras = explode("//",$this->STRING);
// 1.1.1 Se extraen palabras comunes (Exceptionary)
$query = "select palabra_nombre from diccionario_excepcion";
$select = new Select($query, 1, 0 ,$this->NUMERO_PG);
$this->RESULTADOS = $select->RESULTADO;
$this->NUMERO_REGISTROS = $select->NUMERO_REGISTROS;
$ley_exc = "";
$ley_c = 0;
for ($ex = 0; $ex < $this->NUMERO_REGISTROS; $ex++)
{
$count_array = 0;
foreach ($palabras as $word) {
if ($this->RESULTADOS[$ex][0] == $word) {
$excepcion = array_splice($palabras, $count_array, 1);
$ley_c++;
$ley_exc = $ley_exc . $word . " ";
}
$count_array++;
}
}
// 1.1.2 Se muestran las palabras que no se buscarán
if ($ley_c != 0) {
echo "Las siguientes palabras no fueron incluidas en la búsqueda: <b>" . $ley_exc . "</b>";
}
}
// 1.2 Hacer la consulta por cada campo de forma independiente
$i = 0;
foreach ($palabras as $word) {
// 1.2.1 Se define $c que es igual al numero del campo en el recorrido de la variable $tipo_campos
$c = 0;
foreach ($tipo_campos as $campo) {
// 1.2.1.1. Definición del Cuando
$cuando = $campo . " like '%" . $word . "%'" . $and;
$factor = $tipo_valor_campos[$c];
//echo $factor;
// 1.2.1.2. Búsqueda central
$query = "select " . $tipo_seleccion . " from " . $tipo_tabla . " where " . $cuando;
//echo $query;
//echo "/";
$select = new Select($query, 1, 0 ,$this->NUMERO_PG);
// 1.2.1.3. Asignación de resultados
$this->RESULTADOS = $select->RESULTADO;
$this->NUMERO_REGISTROS = $select->NUMERO_REGISTROS;
// 1.2.1.4. Búsqueda y generación del arreglo
// $c_r se usa para controlar el número de registros
//echo $this->NUMERO_REGISTROS;
//echo "<br>";
for ($c_r = 0; $c_r < $this->NUMERO_REGISTROS; $c_r++) {
// 1.2.1.4.1 Extracción del ID encontrado
$id_found = $select->RESULTADO[$c_r][0];
//echo $id_found;
// 1.2.1.4.2 Busca en el arreglo si el ID encontrado existe ya o no
$key = array_search($id_found, $results);
if ($key == "") {
$results_offset = count($results);
$results_offset++;
$results[$results_offset] = $id_found;
$results_numero_campos[$results_offset][$i] = 1;
$results_acumulado[$results_offset][$i] = $factor;
//if ($id_found == 403) {
// Usado para depurar
//echo "-------------------><br>";
//echo $results[$results_offset];
//echo ":";
//echo $results_numero_campos[$results_offset][$i];
//echo ":";
//echo $results_acumulado[$results_offset][$i];
//echo "<br>";
//}
}else{
$results_numero_campos[$key][$i] = $results_numero_campos[$key][$i] + 1;
$results_acumulado[$key][$i] = $results_acumulado[$key][$i] + $factor;
//if ($id_found == 403) {
// Usado para depurar
//echo "-------------------><br>";
//echo $key;
//echo ":";
//echo $results_numero_campos[$key][$i];
//echo ":";
//echo $results_acumulado[$key][$i];
//echo "<br>";
//}
}
}
$c++;
}
$i++;
}
// 3. Cálculo de la importancia de las palabras y su correlación con los ids encontrados
$a_p = 1;
foreach ($results as $valor) {
//echo $a_p . " : ";
//echo $valor;
//echo " - ";
// 3.1 Cálculo de un factor de división por palabra
// de cada palabra encontrada se toman el número de campos en que fue encontrada y este dato se usa como divisor
// de la sumatoria del factor de relevancia de cada campo definido arriba en el arreglo tipo_valor_campos
$b_p = 0;
$numero_palabras = 0;
foreach ($palabras as $word) {
//echo $results_numero_campos[$a_p][$b_p];
//echo " - ";
//echo $results_acumulado[$a_p][$b_p];
//echo " - ";
if ($results_numero_campos[$a_p][$b_p] != "") {
$division[$b_p] = $results_acumulado[$a_p][$b_p] / $results_numero_campos[$a_p][$b_p];
$numero_palabras++;
}else{
$division[$b_p] = 0;
}
$b_p++;
}
// 3.2 Una vez hechas las divisiones, se hace un promedio que es la variable $factor_search[$a_p]
// esta variable se graba en un arreglo igual al de los id´s con el fin después de poderlos ubicar
$total = 0;
$t_p = 1;
if ($numero_palabras != 0) {
foreach (@$division as $d_p) {
$total = $total + $d_p;
$t_p++;
}
}
@$factor_search[$a_p] = $total / ($t_p - 1);
// 3.3 Se asigna a una variable el número de palabras encontradas en cada ID en otro arreglo
// llamado n_palabras.
$n_palabras[$a_p] = $numero_palabras;
// 3.4 Se incrementa el a_p para ir al siguiente resultado.
$a_p++;
}
// 4. Imprime los resultados totales y la paginación de arriba
echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><font size=\"1\">Resultados encontrados: <b>" . ($a_p - 2) . "</b></font></td><td align=\"right\"><font size=\"1\">";
$num_pagina = 0;
$control_puntos = 0;
while (($num_pagina * $num_res) < ($a_p - 2)) {
$inicio_escala = $num_pagina * $num_res;
if ($x_y != "") {
// 4.1 Resolución de mucha paginación
if (($a_p - 2) > 100) {
$if_x = $num_pagina * 10;
//echo $if_x;
// 4.1.2 Función principal
if (($inicio_escala <= ($inicio + 50)) and ($inicio_escala >= ($inicio - 50))) {
// 4.1.2.1 Imprime puntos al inicio diciendo que hay más paginación
if ($if_x > 0 and $control_puntos == 0) {
echo "...";
$control_puntos++;
}else{
$control_puntos++;
}
// 4.1.2.1 Imprime puntos al inicio diciendo que hay más paginación
if ($if_x == $inicio) {
echo " [<b><a href=\"$link?inicio=$inicio_escala&string=$string_back&tipo=$tipo&num_res=$num_res&x_y=$x_y&user=$user&link=$link&and=$and\">$num_pagina</a></b>] ";
}else{
echo " [<a href=\"$link?inicio=$inicio_escala&string=$string_back&tipo=$tipo&num_res=$num_res&x_y=$x_y&user=$user&link=$link&and=$and\">$num_pagina</a>] ";
}
$if_x_e = $if_x;
}
}else{
echo " [<a href=\"$link?inicio=$inicio_escala&string=$string_back&tipo=$tipo&num_res=$num_res&x_y=$x_y&user=$user&link=$link&and=$and\">$num_pagina</a>] ";
}
//echo $inicio;
//echo $a_p;
}else{
echo " [<a href=\"$link?inicio=$inicio_escala&string=$string_back&tipo=$tipo&num_res=$num_res&link=$link\">$num_pagina</a>] ";
//echo $inicio;
}
$num_pagina++;
}
// 4.1.3 (Número reservado que se trae de la función 4.1 para la impresión de puntos) Imprime puntos al final diciendo que hay más paginación
if ($if_x_e < ($a_p -2)) {
echo "...";
$control_puntos++;
}
echo "</font></td></tr></table>";
// 5. Sorting los resultados
arsort($factor_search);
// 5.1 Establecer inicio
$final = $inicio + $num_res;
//echo $inicio;
// 5.2 Extraer en el orden de importancia los resultados enlazados junto a su respectivo Id
$conteo_gral = 0;
foreach ($factor_search as $ind => $f_s) {
// 5.2.1 Extrae solo los resultados buscados.
if ($conteo_gral >= $inicio and $conteo_gral < $final) {
if ($ind != 1) {
//echo $ind . "=" . $f_s . " : ";
//echo $results[$ind] . " -> ";
//echo $n_palabras[$ind];
//echo "<br>";
// 5.2.1.1 Consulta de forma tradicional los id cada uno por aparte
$cuando = $tipo_seleccion . "=" . $results[$ind];
//echo $this->TIPO;
// 5.2.1.2 Hace una excepción por tipo en la impresión de resultados
// Para Contenido
if ($this->TIPO == 1) {
$control = new select_pg(0, $tipo_show_campos, $tipo_tabla, $cuando, 3, 5, "(nombre)-(descripcion)-(texto)", "<p><table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"texto\"><tr><td height=\"2\"></td></tr></table><br><a href=\"$tipo_link$results[$ind]\"><img src=\"../imagenes/pin.gif\" width=\"6\" height=\"6\" border=\"0\"> (nombre).</a><br>(descripcion)</p>", $vinculo_pg ,$inicio_1);
}
// Para Documentos
if ($this->TIPO == 2) {
$control = new select_pg(0, $tipo_show_campos, $tipo_tabla, $cuando, 3, 5, "(nombre)-(descripcion)-(texto)", "<p><table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"texto\"><tr><td height=\"2\"></td></tr></table><br><a href=\"$tipo_link$results[$ind]\"><img src=\"../imagenes/pin.gif\" width=\"6\" height=\"6\" border=\"0\"> (nombre).</a> Archivo: [<i>(texto)</i>]<br>(descripcion)</p>", $vinculo_pg ,$inicio_1);
}
// Para Categorías
if ($this->TIPO == 4) {
$control = new select_pg(0, $tipo_show_campos, $tipo_tabla, $cuando, 3, 5, "(nombre)-(descripcion)-(texto)", "<p><table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"texto\"><tr><td height=\"2\"></td></tr></table><br><a href=\"$tipo_link$results[$ind]&patron=(descripcion)\"><img src=\"../imagenes/pin.gif\" width=\"6\" height=\"6\" border=\"0\"> (nombre).</a><br>Categoría: (descripcion)</p>", $vinculo_pg ,$inicio_1);
}
}
}
$conteo_gral++;
}
}
}
?>
|