Pirado IV's website

just another fucking weblog?

Weblog

Programando un servidor de indexación

Buenas,

Si no os gusta la programación, podéis dejar de leer este post ya mismo.

Resulta que en mi trabajo muevo una enormísima cantidad de ficheros entre diseños a clientes, carteles para imprimir, sellos, tarjetas de visita, ... imaginaros que si al día genero entre 5 y 20 ficheros y llevo trabajando casi 2 años en esta empresa, si os hacéis unos cálculos rápidos teniendo en cuenta que no borramos ningún fichero excepto que el cliente lo pida expresamente, podéis haceros una idea de lo que hablo.

Digamos que la utilidad de búsqueda de Windows deja muchísimo que desear, tarda siglos en encontrar las cosas y, en muchas ocasiones, no encuentra ficheros que estoy seguro de que están ahí. De momento, tampoco tenemos Windows Vista, ni Mac OS X, que ya vienen con su Index Server.

Mi solución ha sido crearme un programa que haga barridos enteros de discos duros a horas programadas guardando toda la información posible sobre cada fichero (fecha de creación, tamaño, extensión, la ruta completa, ...). También le he creado opciones para poder no indexar ficheros que cumplan ciertos requisitos (por ejemplo el típico “Thumbs.db” de Windows).

Lo primero es crearte un método que busque en cada directorio y, a su vez, en cada uno de sus subdirectorios y los directorios de los subdirectorios. Así que preparamos una función que meta todo el listado del directorio en una matriz, luego va comprobando cada elemento de ésta y, si es un directorio, se llama a sí misma para leer todo el listado que está dentro de ella una y otra vez hasta que acaba.

Para agilizar luego las búsquedas, también guardo en otra tabla de la base de datos listados de palabras que se generan troceando los nombres de los ficheros. Por ejemplo:

Fichero 1: magdalenas-de-colores.jpg
Fichero 2: lápices de colores.tif

El programa separa cada palabra, la mete en la tabla y le referenciamos la identificación de cada fichero que la contiene. Así, si hacemos una búsqueda de la palabra “magdalena”, nos mostrará sólo el “Fichero 1”, y si buscamos la palabra “color”, nos mostrará los dos, ya que ambos contienen parte del nombre.

Para hacer búsquedas de varias palabras, lo que he hecho es hacer intersecciones de matrices de búsqueda. Seguro que podéis aprender a utilizarlas mirando la documentación del lenguaje de programación que más os guste.

Como queremos llegar más allá y dado que entre la base de datos y el propio programa (entre 5 y 10 KB) no consumiremos más de 10 MB de disco duro, también ofrezco asignarle categorías (o “tags”, si lo queréis llamar así) a cada fichero o directorio.

A la interfaz del usuario le he añadido previsualizaciones (si es posible) de cada fichero, y si no, un bonito icono que lo identifique fácil con la aplicación que lo puede ejecutar.

¿Qué lenguaje de programación utilizar?, pues para indexar… vosotros mismos, pero cualquiera que se maneje bien con bases de datos os vale. Para la interfaz del usuario yo lo he hecho todo vía web, para no tener que instalar nada en cada ordenador.

A mí me ha valido PHP5 para ambas cosas, que ahora con la programación orientada a objetos es coser y cantar. Apache2 para el servidor web y MySQL para la base de datos.

Espero haberme explicado lo mejor posible, que yo no nací para profesor. Dicen que hay dos tipos de personas, los que saben explicar y los que saben hacer.

Saludotes,
Pirado IV estuvo akí ;)


Comentarios
#1
tzz

Hmm, creo recordar que Windows XP utiliza Index Server únicamente si lo especificas en la búsqueda y entonces funciona bien.

Aquí tienes algo de info: http://xpsearch.info/xps2.htm

No es tan completo como lo que te has currado, pero seguramente no lo hubieses hecho de conocerlo :P:P

#2
Pirado IV

Pero es que ha llegado a un punto en el que creo un fichero que se llame pepito.txt, lo busco en ese directorio por ese nombre y no me lo encuentra xD

Saludotes,
Pirado IV estuvo akí ;)

#3
Pirado IV

Como curiosidad, deciros que una búsqueda en todos los ficheros de un disco duro que contengan la letra “a” (ya sea en mayúsculas, minúsculas, acentos y demás), con este sistema tarda una media de 0,02 segundos.

Saludotes,
Pirado IV estuvo akí ;)

Publicar comentario





Sigue leyendo