20/03/2003, 01:15
|
| | Fecha de Ingreso: febrero-2002 Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 22 años, 9 meses Puntos: 0 | |
Gracias a ambos de nuevo.
Os voy a contar como funciona mi buscador.
Consta de dos partes, la primera de ellas recoge los términos, y la segunda muestra los resultados.
Primera Parte: Está implementada en java, y con una base de datos Oracle 8.0.5
Araña -> La primera vez se parte de una serie de servidores de la universidad. La "araña" recoge todos los términos que no son "palabras vacías" (como de, la, los, etc) y lo introduce en una base de datos. Como hay que relacionar cada palabra con la página a la que pertenece, su párrafo y su posición dentro de él. Se mira si ya existe la palabra, si no existe se hace una inserción en BD, idTermino, termino, localización (donde estará recogido el idPagina:numParrafo;PosParrafo, es un CLOB). Recorre esta tabla hasta que todas las páginas se han visitado y extraido sus términos.
En sucesivas veces, se comprueba si ha habido cambios en alguna página (si la fecha es más reciente que la que había en base de datos) y se borran todos las entradas de la tabla términos que había de esa página.
2ª parte -> página PHP. (aqui está el lío)
Hay un cuadro de texto donde el usuario introduce lo que quiere buscar. Se admite el símbolo + para el AND, y el - para el AND NOT. Si no se pone nada se presupone un OR.
Se separan las palabras a buscar en 4 arrays (array para las OR, array para las AND, array para los AND NOT y otro array para las palabras vacías).
Una vez que se tienen los 4 arrays se crean las lecturas a base de datos.
Se hace una lectura por array (bueno, del de las palabras vacías no).
Se crea cada sentencia leyendo de la tabla terminos el campo localización (que recuerdo es un CLOB). Pero como todos los datos de ese campo no me interesan, de momento solo quiero saber el número de página, ejecuto un procedimiento de oracle que me devuelve en una cadena separada por espacios los números de página .
Para construir la cadena de los OR por ejemplo:
$condicionO = "lower(termino)='$MaO[0]'";
$ctosO=tamanioMatriz($MaO);
if ($ctosO>1) {
for ($o=1;$o<$ctosO;$o++){
$condicionO=$condicionO." or Lower(termino)='$MaO[$o]'";
} /* for o*/
} /* if ctosO */
y realiza la lectura de base de datos.
Para construir la cadena de los AND:
se repite tantas veces como palabras haya la lectura y se va haciendo la y entre las dos matrices que van resultando. (Quizá aqui esté el cuello de botella).
Para la cadena de los AND NOT:
También se hace una lectura por cada palabra para luego ir concatenando los resultados, con una coma y luego hacer un AND NOT IN(....).
Con estas tres matrices, hacemos las operaciones de "y", "no" y "or". Y obtenemos en una nueva matriz las páginas de las que realmente queremos saber sus datos para crear los enlaces.
No se si os habrá aclarado algo, si ves interesante pasarlo a otro foro, acepto encantada. Con esto me he dado cuenta que quizá hago demasiadas lecturas de unos campos demasiado grandes y eso penalice las búsquedas. Si teneis alguna sugerencia o bien, alguna duda, ya sabeis.
Cristina |