TNTSearch est un moteur de recherche en texte intégral (FTS) entièrement écrit en PHP. Une configuration simple vous permet d'ajouter une expérience de recherche étonnante en quelques minutes seulement. Les fonctionnalités incluent :
Nous avons également créé des pages de démonstration qui montrent la récupération tolérante avec les n-grammes en action. Le package contient de nombreuses fonctions d'assistance telles que la similarité Jaro-Winkler et Cosinus pour les calculs de distance. Il prend en charge l'anglais, le croate, l'arabe, l'italien, le russe, le portugais et l'ukrainien. Si les stemmers intégrés ne suffisent pas, le moteur vous permet de brancher facilement n'importe quel stemmer compatible. Certains forks du package prennent même en charge le chinois. Et s'il vous plaît, contribuez dans d'autres langues !
Contrairement à de nombreux autres moteurs, l'index peut être facilement mis à jour sans effectuer de réindexation ni utiliser de deltas.
Voir la démo en ligne | Suivez-nous sur Twitter ou Facebook | Visitez nos sponsors :
Si vous utilisez TNT Search et que vous le trouvez utile, jetez un œil à notre outil d'analyse premium :
Le moyen le plus simple d'installer TNTSearch est via composer :
composer require teamtnt/tntsearch
Avant de continuer, assurez-vous que votre serveur répond aux exigences suivantes :
Afin de pouvoir effectuer des requêtes de recherche en texte intégral, vous devez créer un index.
Usage:
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ([
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' dbname ' ,
' username ' => ' user ' ,
' password ' => ' pass ' ,
' storage ' => ' /var/www/tntsearch/examples/ ' ,
' stemmer ' => TeamTNT TNTSearch Stemmer PorterStemmer ::class//optional
]);
$ indexer = $ tnt -> createIndex ( ' name.index ' );
$ indexer -> query ( ' SELECT id, article FROM articles; ' );
//$indexer->setLanguage('german');
$ indexer -> run ();
Important : les paramètres de "stockage" marquent le dossier dans lequel tous vos index seront enregistrés. Assurez-vous donc d'avoir l'autorisation d'écrire dans ce dossier, sinon vous pourriez vous attendre à l'exception suivante :
Remarque : Si votre clé primaire est différente de id
définissez-la comme :
$ indexer -> setPrimaryKey ( ' article_id ' );
Par défaut, la clé primaire ne peut pas être recherchée. Si vous souhaitez le rendre consultable, exécutez simplement :
$ indexer -> includePrimaryKey ();
La recherche d’une expression ou d’un mot-clé est triviale :
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
$ res = $ tnt -> search ( " This is a test search " , 12 );
print_r ( $ res ); //returns an array of 12 document ids that best match your query
// to display the results you need an additional query against your application database
// SELECT * FROM articles WHERE id IN $res ORDER BY FIELD(id, $res);
La clause ORDER BY FIELD est importante, sinon le moteur de base de données ne renverra pas les résultats dans l'ordre requis.
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
//this will return all documents that have romeo in it but not juliet
$ res = $ tnt -> searchBoolean ( " romeo -juliet " );
//returns all documents that have romeo or hamlet in it
$ res = $ tnt -> searchBoolean ( " romeo or hamlet " );
//returns all documents that have either romeo AND juliet or prince AND hamlet
$ res = $ tnt -> searchBoolean ( " (romeo juliet) or (prince hamlet) " );
Le flou peut être modifié en définissant les variables membres suivantes :
public $ fuzzy_prefix_length = 2 ;
public $ fuzzy_max_expansions = 50 ;
public $ fuzzy_distance = 2 ; //represents the Levenshtein distance;
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
$ tnt -> fuzziness ( true );
//when the fuzziness flag is set to true, the keyword juleit will return
//documents that match the word juliet, the default Levenshtein distance is 2
$ res = $ tnt -> search ( " juleit " );
Une fois que vous avez créé un index, vous n'avez pas besoin de le réindexer à chaque fois que vous apportez des modifications à votre collection de documents. TNTSearch prend en charge les mises à jour d'index dynamiques.
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
$ index = $ tnt -> getIndex ();
//to insert a new document to the index
$ index -> insert ([ ' id ' => ' 11 ' , ' title ' => ' new title ' , ' article ' => ' new article ' ]);
//to update an existing document
$ index -> update ( 11 , [ ' id ' => ' 11 ' , ' title ' => ' updated title ' , ' article ' => ' updated article ' ]);
//to delete the document from index
$ index -> delete ( 12 );
Tout d’abord, créez votre propre classe Tokenizer. Il doit étendre la classe AbstractTokenizer, définir la valeur $pattern du partage de mots et doit implémenter TokenizerInterface :
use TeamTNT TNTSearch Support AbstractTokenizer ;
use TeamTNT TNTSearch Support TokenizerInterface ;
class SomeTokenizer extends AbstractTokenizer implements TokenizerInterface
{
static protected $ pattern = ' /[s,.]+/ ' ;
public function tokenize ( $ text ) {
return preg_split ( $ this -> getPattern (), strtolower ( $ text ), - 1 , PREG_SPLIT_NO_EMPTY );
}
}
Ce tokenizer divisera les mots en utilisant des espaces, des virgules et des points.
Une fois le tokenizer prêt, vous devez le transmettre à TNTIndexer
via la méthode setTokenizer
.
$ someTokenizer = new SomeTokenizer ;
$ indexer = new TNTIndexer ;
$ indexer -> setTokenizer ( $ someTokenizer );
Une autre façon serait de passer le tokenizer via config :
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ([
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' dbname ' ,
' username ' => ' user ' ,
' password ' => ' pass ' ,
' storage ' => ' /var/www/tntsearch/examples/ ' ,
' stemmer ' => TeamTNT TNTSearch Stemmer PorterStemmer ::class//optional,
' tokenizer ' => TeamTNT TNTSearch Support SomeTokenizer ::class
]);
$ indexer = $ tnt -> createIndex ( ' name.index ' );
$ indexer -> query ( ' SELECT id, article FROM articles; ' );
$ indexer -> run ();
$ candyShopIndexer = new TNTGeoIndexer ;
$ candyShopIndexer -> loadConfig ( $ config );
$ candyShopIndexer -> createIndex ( ' candyShops.index ' );
$ candyShopIndexer -> query ( ' SELECT id, longitude, latitude FROM candy_shops; ' );
$ candyShopIndexer -> run ();
$ currentLocation = [
' longitude ' => 11.576124 ,
' latitude ' => 48.137154
];
$ distance = 2 ; //km
$ candyShopIndex = new TNTGeoSearch ();
$ candyShopIndex -> loadConfig ( $ config );
$ candyShopIndex -> selectIndex ( ' candyShops.index ' );
$ candyShops = $ candyShopIndex -> findNearest ( $ currentLocation , $ distance , 10 );
use TeamTNT TNTSearch Classifier TNTClassifier ;
$ classifier = new TNTClassifier ();
$ classifier -> learn ( " A great game " , " Sports " );
$ classifier -> learn ( " The election was over " , " Not sports " );
$ classifier -> learn ( " Very clean match " , " Sports " );
$ classifier -> learn ( " A clean but forgettable game " , " Sports " );
$ guess = $ classifier -> predict ( " It was a close election " );
var_dump ( $ guess [ ' label ' ]); //returns "Not sports"
$ classifier -> save ( ' sports.cls ' );
$ classifier = new TNTClassifier ();
$ classifier -> load ( ' sports.cls ' );
Vous êtes libre d'utiliser ce package, mais s'il parvient à votre environnement de production, nous apprécierions grandement que vous nous envoyiez un jeu PS4 de votre choix. De cette façon, vous nous aidez à développer davantage et à ajouter de nouvelles fonctionnalités.
Notre adresse est : TNT Studio, Sv. Mateja 19, 10010 Zagreb, Croatie.
Nous publierons ici tous les jeux reçus
Soutenez-nous avec un don mensuel et aidez-nous à poursuivre nos activités. [Devenez contributeur]
Devenez sponsor et obtenez votre logo sur notre README sur Github avec un lien vers votre site. [Devenez parrain]
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.
De Croatie avec ♥ de TNT Studio (@tntstudiohr, blog)