1 Search::Indexer Indexation plein-texte en Perl
LD, PJGE, juin Indexation plein-texte veaux vaches cochons couvée 1, 2, 5, 77, 78, 79, 123 3, 7, 34, 56 1, 2, 3, 4, 19 4, 5, 6, 7, 55, TermesListes inversesDocuments (veaux ET vaches) OU cochons
LD, PJGE, juin Information positionnelle veaux vaches 1, 2, 5, 77, 78, 79, 123 3, 7, 34, TermesListes inversesDocuments « adieu, veaux, vaches »veaux NEAR vaches 6, 134, , 99, 107, 111 Positions des mots
LD, PJGE, juin Quelques logiciels MS Longhorn MacIntosh Google Desktop Copernic COVEO Fulcrum Livelink HtDig Google Appliance Altavista Desktop Entreprise Web Boîte à outils Lucene MySQL dtSearch Swish-E Search::Indexer
LD, PJGE, juin Boîte à outils u Moteur général d’indexation Adaptable pour applications ad hoc u À fournir par composants externes : Spider (injection des documents à indexer) Conversions de formats (.doc,.html, etc. .txt) Couche de présentation des résultats
LD, PJGE, juin Autres modules Perl u Text::Freesearch Compact, fonctions de base u Search::InvertedIndex Pas d'information sur positions u Plucene Très complet > 60 classes (+ dépendances) problèmes de lenteur u Search::Kinosearch alpha, chargé sur CPAN le 8 juin 2005
7 Search::Indexer
LD, PJGE, juin Structure u Analyseur regex + callback u Stockage index: 3 fichiers BerkeleyDB Listes d’entiers compressés (pack ‘w’) u Requêtes booléennes: Search::QueryParser
LD, PJGE, juin API use Search::Indexer; my $ix = new Search::Indexer( dir => $dir, writeMode => 1, wregex => qr/\w+/, wfilter => sub {...}); $ix->add($docId, docContent($docId)); $ix->remove($docId);
LD, PJGE, juin API (suite) $r = $ix->search('+veaux –vaches'); $r = $ix->search('chat ET (rat OU souris)'); $r = $ix->search(' "phrase exacte" = foreach my $docId { my $score = $r->{scores}{$docId}; print "DOC $docId: $score\n"; }
LD, PJGE, juin API (suite) foreach my $docId { = $ix->excerpts(docContent($docId), $r->{regex}); print join(" / "\n"; } Extraits :...devenu entre-temps la direction du logement (ci- après : la DL), a maintenu l’allocation de logement pour la période du 1er avril /... A/1772/2004 TA/S2.THE (TPE) ALLOCATION DE LOGEMENT; LOCATAIRE; PRINCIPE DE LA BONNE F... /... la DL de verser rétroactivement l'allocation de logement. Demande incomplète (art. 25 al 1... /...ge non compris. Ils perçoivent une allocation de logement mensuelle de CHF depuis le 1...
LD, PJGE, juin Implémentation : new() # word => wordId $self->{ixwDb} = tie %{$self->{ixw}}, 'BerkeleyDB::Btree',... # wordId => [docId1 => nOccur1,...] $self->{ixdDb} = tie %{$self->{ixd}}, 'BerkeleyDB::Hash',... # (docId, wordId) => [pos1, pos2,...] $self->{ixpDb} = tie %{$self->{ixp}}, 'BerkeleyDB::Btree',..
LD, PJGE, juin Implémentation : add() my %positions; for (my $nwords=1; $buf =~ /$self->{wregex}/g; $nwords++) { my $word = $self->{wfilter}->($&) or next; my $wordId = $self->{ixw}{$word}; $nwords; } while (my ($wd, $p) = each %positions) { $self->{ixd}{$wd}.= pack('wC', $docId, $self->{ixp}{$docId, $wd} = }
LD, PJGE, juin Implémentation : search() $scores = {unpack '(wC)*', $self->{ixd}{$wd}}; = keys %$scores; my $nDocs = $self->{ixd}{NDOCS}; if { my $coeff = log($nDocs + * 100; $scores->{$_} = int($coeff * $scores->{$_}) } # AND, OR : union/intersection de %$scores
LD, PJGE, juin Métriques u Search::Indexer 819 lignes (dont 222 POD) 5 méthodes 10 options pour new() u Search::QueryParser 480 lignes (dont 228 POD) 4 méthodes 7 options pour new() u env. 3,5 fois plus rapide que Plucene
LD, PJGE, juin TODO liste u verrous, concurrence u calcul des combinaisons de scores u comparaisons de performances u opérateurs NEAR et ^n (boost) u format des index (compression)
17 Démo...