Je parlais il y a 2 jours de sphinx en expédiant une explication en 2 secondes.
Le lendemain, je vois sur Planet Mysql que Shlomi Noach publiait un article pour remettre les pendules à l'heure sur ce qu'est sphinx
Je vais donc en dire un peu plus.
Sphinx est un moteur d'indexation/recherche open-source sous GPLv2.
On utilise indexer pour scanner ce qu'il faut indexer, cela génère des fichiers que searchd rend consultables.
Pour attaquer searchd, on a search en ligne de commande.
Mais on a aussi
- SphinxSE: un engine mysql, il sera inclus directement dans les prochaines versions de mariaDb
- SphinxAPI: que l'on peut utiliser en php avec un package pecl dedié mais aussi avec les apis officielles Php, Python, Java, Ruby, pur C, fournies avec sphinx, ou bien encore Riddle pour Ruby, Sphinx::Search pour perl, C++ Sphinx client, Haskell Sphinx client, C# .NET client, ...
- SphinxQL: une syntaxe sql adaptée
Recherche
Pour la recherche elle même on a les syntaxes avancées sur le texte ...
- et, ou , mais pas,
"hello world" @title "example program"~5 @body python -(php|perl) @* code
- les quorum (je donne 7 mots et je veux qu'il y en aie au moins 4 dans chaque résultats)
- la pertinence (ce mot là a plus de poids dans le titre, celui ci partout, ... )
- la distance dans le texte : ces 2 mots là doivent être séparés par moins de n mots
- Des remplacements
- de caractères pour les problèmes de charset
- les remplacements magiques (si je cherche email, je trouve aussi les contenus avec le mot courriel) sur base de vos listes (voir exemple en bas)
- Morphologie linguistique, stemming (gestion des pluriels),
- listes de mots interdits
- listes de dictionnaires personnels pour la correction magique
- ...
.. Les critères de filtre et tri annexe
- groupes (avec decompte par groupe)
- temporels
- géographiques
- ...
J'en passe bien sur.
Le service searchd est consultable via réseau (donc si vous utilisez SphinxSE il n'est pas embarqué dans la DB il peut/ils peuvent être ailleurs) avec ssl et tout le brol.
Indexation
La première chose à distinguer c'est qu'il n'est pas limité à mysql ni même à des bases de données. On peut indexer tout ce qui peut être parsé, moyennant une conversion vers un fichier xml.
On peut indexer des sources hétérogènes les mélanger comme on peut indexer partiellement une source monolithique.
On peut indexer "sur le coté" pendant que l'index précédent reste actif et swapper à la fin (très difficile à faire : il faut ajouter un --rotate)
On peut indexer par petit morceaux et exploiter les partitions ou les merger
On peut répartir les indexs sur plusieurs serveurs
Brefs il y a moyen de distribuer la recherche et l'indexation.
Il y a des techniques de RealTime indexing mais c'est dans la 1.10-beta
Qui l'utilise ?
- Craigslist,
- DailyMotion,
- Netlog,
- Delcampe.net,
- thepiratebay.org
- mininova
- opensubtitles.org
- bcp d'autres ...
De nombreux plugins pour des produits connus existent pour exploiter l'indexation sphinx de leur structure de donnée.
- Drupal
- Symfony
- phpBB
- MovableType
- MediaWiki
- Phorum
- Rails : Thinking, Ultrasphinx, acts_as_sphinx
- ActiveRecord :Sphincter
Performances
l'indexation.
Sphinx indexe jusqu'à 10-15 Mo de texte par seconde par CPU simple core, Soit +de 60 Mo/s par serveur (sur une machine dédiée indexation).
Recherche.
Sur une machine de bureau 2-core avec 2 Go de RAM. Dans une collection de 1.000.000 document, soit 1,2 Go de textes : + de 500 requêtes/sec.
Extensibilité.
- le plus actif Craigslist, site top-10 aux États-Unis qui sert plus de 50 millions de requêtes de recherche/jour.
- boardreader.com, 2,000,000,000 documents, 2.0 TB of data.
Quelques exemples
recherche via PHP et le package pecl
<?php $s = new SphinxClient; $s->setServer("localhost", 6712); $s->setMatchMode(SPH_MATCH_ANY); $s->setMaxQueryTime(3); $result = $s->query("test"); var_dump($result); ?>
Recherches via mysql et SphinxSE
SELECT * FROM t1 ... ... WHERE query='test it;mode=any;sort=attr_asc:group_id;!filter=group_id,3,11;'; ... WHERE query='test;sort=extended:@weight desc, group_id ascindex=test1;'; ... WHERE query='test;index=test1,test2,test3;weights=1,2,3;filter=group_id,1,5,19;'; ... WHERE query='test;!range=group_id,5,25;'; ... WHERE query='test;maxmatches=2000;groupby=day:published_ts;'; ... WHERE query='test;groupby=attr:group_id;groupsort=@count desc;'; ... WHERE query='test;indexweights=idx_exact,2,idx_stemmed,1;comment=marker001;select=2*a+3*b as myexpr;';
Commande d'indexation
[sh] $ indexer --rotate --all --quiet --noprogress mybigindex $ indexer mysmallindex mybigindex $ indexer --config /home/myuser/sphinx.conf myindex $ indexer --config /home/myuser/sphinx.conf --all $ indexer myindex --buildstops word_freq.txt 1000 $ indexer myindex --buildstops word_freq.txt 1000 --buildfreqs $ indexer --merge main delta --rotate $ indexer --merge main delta --merge-dst-range deleted 0 0
Un fichier de remplacement
[fichier de remplacements] AT & T => AT&T AT&T => AT&T Standarten Fuehrer => standartenfuhrer Standarten Fuhrer => standartenfuhrer MS Windows => ms windows Microsoft Windows => ms windows C++ => cplusplus c++ => cplusplus C plus plus => cplusplus








Commentaires
1. Le mercredi 16 février 2011 à 18:07, par oliv
2. Le jeudi 17 mars 2011 à 22:24, par Moosh
Ajouter un commentaire