Viewing file: class_search.php (11.19 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)
{
$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=";
}else{
$tipo_link = "contenido_links_administracion.php?x_y=$x_y&user=$user&id_app=21&accion=-1&links_id=";
}
}
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_pie";
if ($x_y != "") {
$tipo_link = "contenido_foto_y_medios_administracion.php?x_y=$x_y&user=$user&id_app=19&accion=-1&foto_id=";
}else{
$tipo_link = "contenido_foto_y_medios_administracion.php?x_y=$x_y&user=$user&id_app=19&accion=-1&foto_id=";
}
}
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";
if ($x_y != "") {
$tipo_link = "contenido_categoria_administracion.php?x_y=$x_y&user=$user&id_app=18&accion=-1&categoria_id=";
}else{
$tipo_link = "contenido_categoria_administracion.php?x_y=$x_y&user=$user&id_app=18&accion=-1&categoria_id=";
}
}
//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 . "%'";
$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;
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\" class=\"texto\"><tr><td>Resultados encontrados: <b>" . ($a_p - 2) . "</b></td><td align=\"right\">";
$num_pagina = 0;
while (($num_pagina * $num_res) < ($a_p - 2)) {
$inicio_escala = $num_pagina * $num_res;
if ($x_y != "") {
echo " [<a href=\"$link?inicio=$inicio_escala&string=$string_back&tipo=$tipo&num_res=$num_res&x_y=$x_y&user=$user&link=$link\">$num_pagina</a>] ";
}else{
echo " [<a href=\"$link?inicio=$inicio_escala&string=$string_back&tipo=$tipo&num_res=$num_res&link=$link\">$num_pagina</a>] ";
}
$num_pagina++;
}
echo "</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];
$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> <i>(tipo)</i><br>(descripcion)</p>", $vinculo_pg ,$inicio_1);
}
}
$conteo_gral++;
}
}
}
?>
|