Récemment, nous devions mettre en place pour le site Produit-batiment un moteur de recherche capable d’indexer des documentation pdf. Ayant l’habitude de swish-e pour notre moteur de recherche shopping, nous avons décidé d’utiliser cet outil pour indexer les pdf.
Après quelques recherches, je suis tombé sur cet article :
http://swish-e.org/archive/2003-05/5502.html
J’ai donc testé la configuration mentionnée :
$ swish-e -c f.conf -S prog
f.conf
------
$ cat f.conf
IndexDir /home/moseley/swish-e/prog-bin/spider.pl
ReplaceRules remove "http://"
SwishProgParameters spider.conf
IndexContents HTML* .html .htm .pdf
DefaultContents HTML*
StoreDescription HTML* <body> 200000
MetaNames swishdocpath swishtitle
spider.conf
----------
This is basically just a trimmed down version of the example in SwishSpiderConfig.pl
$ cat spider.conf
# so can find the pdf2html and doc2txt modules
use lib '/home/moseley/swish-e/prog-bin';
@servers = (
{
base_url => 'http://localhost/apache/verhey.pdf',
agent => 'swish-e spider http://swish-e.org/',
email => 'spider@hank.org',
# limit to only .html files
test_url => sub { $_[0]->path =~ /\.html?$/ },
delay_min => .0001,
keep_alive => 1, # enable keep alives requests
test_url => sub { $_[0]->path !~ /\.(?:gif|jpeg)$/ },
test_response => sub {
my $content_type = $_[2]->content_type;
my $ok = grep { $_ eq $content_type } qw{ text/html text/plain application/pdf application/msword };
return 1 if $ok;
print STDERR "$_[0] wrong content type ( $content_type )\n";
return;
},
filter_content => [ \&pdf, \&doc ],
},
);
use pdf2html; # included example pdf converter module
sub pdf {
my ( $uri, $server, $response, $content_ref ) = @_;
return 1 unless $response->content_type eq 'application/pdf';
# for logging counts
$server->{counts}{'PDF transformed'}++;
$$content_ref = ${pdf2html( $content_ref, 'title' )};
$$content_ref =~ tr/ / /s;
return 1;
}
use doc2txt; # included example pdf converter module
sub doc {
my ( $uri, $server, $response, $content_ref ) = @_;
return 1 unless $response->content_type eq 'application/msword';
# for logging counts
$server->{counts}{'DOC transformed'}++;
$$content_ref = ${doc2txt( $content_ref )};
return 1;
}
# Must return true...
1;
Après quelques tests, je suis arrivé à la même problématique que l’auteur de post : l’indexation d’un pdf ne fonctionne pas. J’ai donc ouvert le fichier pdf2html.pm pour voir comment il fonctionne. J’ai rapidement vu qu’il utilisait pdfinfo et pdftotext. Comme ces deux outils fonctionnent avec des fichiers locaux, le spider.pl de swish-e ne fonctionne pas. J’ai donc fait un outil pour récupérer dans un premier temps les fichiers pdf en local et dessus je passe l’outil pdftotext. J’ai donc un dossier contenant tous mes fichiers au format txt qui me permet de lancer l’indexation sur le dossier :
swish-e -f index/index.recherche.tmp -i document/
Ca fonctionne parfaitement et avec cette méthode, j’ai élargie le fonctionnement en intégrant les formats word, excel et rtf.
Très rapidement, on a à disposition un moteur de recherche multi-format très performant.
Commentaires récents