2009-02-26 4 views
3

Nous avons une application Web basée sur Perl dont les données proviennent d'un vaste référentiel de fichiers texte plats. Ces fichiers plats sont placés dans un répertoire de notre système, nous les analysons de manière approfondie en insérant des bits d'information dans une base de données MySQL, puis déplaçons ces fichiers vers leur dépôt archivé et leur répertoire permanent (/www/website/archive/*.txt). Maintenant, nous n'analysons pas chaque bit de données de ces fichiers plats et certains des éléments de données les plus obscurs ne sont pas stockés dans la base de données. Actuellement, les utilisateurs doivent être en mesure d'effectuer une recherche en texte intégral sur l'ensemble du référentiel de fichiers à partir d'une page Web générée par Perl et de ramener une liste de résultats qu'ils pourraient ensuite cliquer et ouvrir. les fichiers texte pour révision.Comment effectuer une recherche de texte intégral dans des fichiers plats avec Perl?

Quelle est la méthode la plus élégante, la plus efficace et la moins gourmande en ressources CPU pour activer cette fonction de recherche?

Répondre

9

je recommande, dans cet ordre:

  1. sucent l'ensemble de tous les documents dans une table MySQL et utiliser la recherche en texte intégral et les fonctionnalités d'indexation de MySQL. Je ne l'ai jamais fait mais MySQL a toujours été capable de gérer plus que je ne peux le faire. Swish-E (http://swish-e.org/) existe toujours et est conçu pour créer des index de texte intégral et permettre des résultats classés. Je l'utilise depuis quelques années et ça marche plutôt bien.

  2. Vous pouvez utiliser File :: Find dans votre code Perl pour parcourir le dépôt comme grep -r, mais il sera nul par rapport à l'une des options indexées ci-dessus. Cependant, cela fonctionnera, et pourrait même vous surprendre :)

+0

Maintenant que vous le dites, j'ai entendu de bonnes choses à propos de Swish-E. Bonne recommandation. – daotoad

+0

Je vais appuyer la recommandation swish-e. C'est un peu bizarre au début (j'ai trouvé la terminologie déroutante) mais une fois que tu as passé que ça marche vraiment, vraiment bien et très vite! –

+0

Est-ce que quelqu'un a essayé l'option MySQL? J'ai voulu jouer avec lui depuis que j'ai remarqué la section dans le manuel il y a une ou deux versions. – Nathan

3

Je recommande d'utiliser un moteur de recherche dédié pour effectuer votre indexation et vos recherches.

Je n'ai pas regardé les moteurs de recherche récemment, mais j'ai utilisé ht://dig il y a quelques années, et j'étais heureux avec les résultats.

Mise à jour: Il semble que ht: // dig soit un projet de zombies à ce stade. Vous voudrez peut-être utiliser un autre moteur. Hyper Estraier, en plus d'être imprononçable semble prometteur.

2

Je recommande l'ajout d'une machine à indexer. Considérez Namazu de http://namazu.org. Quand j'en avais besoin, il m'a semblé plus facile de démarrer que Swish-e, ht: // dig et j'en suis assez content.

Si vous ne voulez pas l'overhead d'un indexeur, cherchez à forcer un grep/egrep. Une fois que le volume de texte va à multi-méga-octets, ce sera nettement plus rapide que la numérisation uniquement en Perl, par exemple:

open GREP, "find $dirlist -name '$filepattern' | xargs egrep '$textpattern' |" 
             or die "grep: $!"; 
while (<GREP>) { 
     ... 
} 

Bonus: utiliser les conventions de nom de fichier comme dates/tags/etc pour réduire l'ensemble des fichiers à grep . Le clunky find ... | xargs ... est conçu pour contourner les limites de taille du shell sur les extensions génériques que vous pourriez rencontrer avec de grosses archives.

0

Je vois quelqu'un de recommandé Lucene/Plucene. Découvrez KinoSearch, je l'utilise depuis un an ou plus sur un projet basé sur Catalyst, très heureux avec la performance et la facilité de programmation/maintenance.

La mise en garde sur cette page devrait être considérée pour votre circonstance, mais je peux attester de la stabilité du module.

Questions connexes