Bueno, aún siendo archivos CSV, son archivos de texto, así que se puede buscar en ellos con un grep() (si el número de documentos no es excesivo, claro).
Lo que hay que hacer es partir la entrada del usuario, en palabras (\w+) y luego recorrer cada documento, asignándole una nota según contenga más o menos palabras de las que ha ingresado el usuario.
Algo así:
- obtener la lista de palabras que introduce el usuario
- por cada documento a mirar
- contar uno por cada palabra que el documento contenga: $contador++ while /lista|palabras/g;
- repetir para todos los documentos
- sacar el listado de documentos ordenados de mayor a menor nota.
Naturalmente, esto es muy simplista, porque
- habría que desechar antes las palabras que introduce el usuario y que no aportan valor a la búsqueda (por ejemplo, las preposiciones)
- no encuentra palabras similares (si pone abad, encuentra abadía, pero si pone disfraz, no encuentra disfraces)
Para lo primero, es fácil: un grep() que desestime las palabras más comunes.
Para lo segundo, se podría ampliar la búsqueda usando alguno de los módulos indicados antes, para buscar similitudes. Pero habría que hacerlo palabra por palabra. Mejor entonces leer el documento, sacar las palabras diferentes, desechar las no interesantes, y buscar en el resto coincidencias con lo que se busca.
Humm... creo que vas a tardar menos si buscas algún módulo así en CPAN.
Casi todos los motores de búsqueda de tamaño medio-grande usan un sistema de indexación previa de los contenidos, para que luego la búsqueda se haga lo más rápido posible.
Tienes un montón de soluciones que abarcan muchos niveles:
Lucy,
Catmandu,
ElasticSearch,
WebService::Solr... estos son para grandes volúmenes de información.
Search::Fulltext sí que te puede servir para lo que quieres, para un volumen de tamaño medio.
AnyData o
DBD::CSV para poco volumen.