TNTSearch ist eine vollständig in PHP geschriebene Volltextsuchmaschine (FTS). Mit einer einfachen Konfiguration können Sie in nur wenigen Minuten ein fantastisches Sucherlebnis hinzufügen. Zu den Funktionen gehören:
Wir haben auch einige Demoseiten erstellt, die das tolerante Abrufen mit N-Grammen in Aktion zeigen. Das Paket verfügt über eine Reihe von Hilfsfunktionen wie Jaro-Winkler- und Kosinus-Ähnlichkeit für Entfernungsberechnungen. Es unterstützt die Wortstammerkennung für Englisch, Kroatisch, Arabisch, Italienisch, Russisch, Portugiesisch und Ukrainisch. Wenn die eingebauten Stemmer nicht ausreichen, können Sie mit der Engine ganz einfach jeden kompatiblen Schneeballstecher anschließen. Einige Forks des Pakets unterstützen sogar Chinesisch. Und bitte tragen Sie weitere Sprachen bei!
Im Gegensatz zu vielen anderen Engines kann der Index problemlos aktualisiert werden, ohne dass eine Neuindizierung oder die Verwendung von Deltas erforderlich ist.
Online-Demo ansehen | Folgen Sie uns auf Twitter oder Facebook | Besuchen Sie unsere Sponsoren :
Wenn Sie TNT Search verwenden und es nützlich finden, werfen Sie einen Blick auf unser Premium-Analysetool:
Der einfachste Weg, TNTSearch zu installieren, ist über Composer:
composer require teamtnt/tntsearch
Bevor Sie fortfahren, stellen Sie sicher, dass Ihr Server die folgenden Anforderungen erfüllt:
Um Volltextsuchen durchführen zu können, müssen Sie einen Index erstellen.
Verwendung:
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 ();
Wichtig: Die „Speicher“-Einstellungen markieren den Ordner, in dem alle Ihre Indizes gespeichert werden. Stellen Sie daher sicher, dass Sie über die Berechtigung zum Schreiben in diesen Ordner verfügen, andernfalls wird möglicherweise die folgende Ausnahme ausgelöst:
Hinweis: Wenn sich Ihr Primärschlüssel von id
unterscheidet, legen Sie ihn wie folgt fest:
$ indexer -> setPrimaryKey ( ' article_id ' );
Standardmäßig ist der Primärschlüssel nicht durchsuchbar. Wenn Sie es durchsuchbar machen möchten, führen Sie einfach Folgendes aus:
$ indexer -> includePrimaryKey ();
Die Suche nach einer Phrase oder einem Schlüsselwort ist trivial:
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);
Die ORDER BY FIELD-Klausel ist wichtig, da die Datenbank-Engine sonst die Ergebnisse nicht in der erforderlichen Reihenfolge zurückgibt.
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) " );
Die Unschärfe kann durch Festlegen der folgenden Mitgliedsvariablen optimiert werden:
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 " );
Sobald Sie einen Index erstellt haben, müssen Sie ihn nicht jedes Mal neu indizieren, wenn Sie Änderungen an Ihrer Dokumentensammlung vornehmen. TNTSearch unterstützt dynamische Indexaktualisierungen.
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 );
Erstellen Sie zunächst Ihre eigene Tokenizer-Klasse. Es sollte die AbstractTokenizer-Klasse erweitern, den $pattern-Wert für die Wortaufteilung definieren und TokenizerInterface implementieren:
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 );
}
}
Dieser Tokenizer trennt Wörter mithilfe von Leerzeichen, Kommas und Punkten.
Nachdem Sie den Tokenizer bereit haben, sollten Sie ihn über die setTokenizer
-Methode an TNTIndexer
übergeben.
$ someTokenizer = new SomeTokenizer ;
$ indexer = new TNTIndexer ;
$ indexer -> setTokenizer ( $ someTokenizer );
Eine andere Möglichkeit wäre, den Tokenizer per config zu übergeben:
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 ' );
Es steht Ihnen frei, dieses Paket zu verwenden, aber wenn es in Ihre Produktionsumgebung gelangt, würden wir uns sehr freuen, wenn Sie uns ein PS4-Spiel Ihrer Wahl schicken. Auf diese Weise unterstützen Sie uns bei der Weiterentwicklung und dem Hinzufügen neuer Funktionen.
Unsere Adresse ist: TNT Studio, Sv. Mateja 19, 10010 Zagreb, Kroatien.
Alle eingegangenen Spiele veröffentlichen wir hier
Unterstützen Sie uns mit einer monatlichen Spende und helfen Sie uns, unsere Aktivitäten fortzusetzen. [Unterstützer werden]
Werden Sie Sponsor und erhalten Sie Ihr Logo in unserer README-Datei auf Github mit einem Link zu Ihrer Website. [Sponsor werden]
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.
Aus Kroatien mit ♥ von TNT Studio (@tntstudiohr, Blog)