TNTSearch adalah mesin pencarian teks lengkap (FTS) yang seluruhnya ditulis dalam PHP. Konfigurasi sederhana memungkinkan Anda menambahkan pengalaman pencarian yang luar biasa hanya dalam hitungan menit. Fitur-fiturnya meliputi:
Kami juga membuat beberapa halaman demo yang menunjukkan pengambilan yang toleran dengan tindakan n-gram. Paket ini memiliki banyak fungsi pembantu seperti Jaro-Winkler dan kesamaan Cosine untuk perhitungan jarak. Mendukung stemming untuk bahasa Inggris, Kroasia, Arab, Italia, Rusia, Portugis, dan Ukraina. Jika stemmer bawaan tidak cukup, mesin memungkinkan Anda memasang stemmer bola salju yang kompatibel dengan mudah. Beberapa cabang paket bahkan mendukung bahasa Mandarin. Dan tolong sumbangkan bahasa lain!
Tidak seperti banyak mesin lainnya, indeks dapat dengan mudah diperbarui tanpa melakukan pengindeksan ulang atau menggunakan delta.
Lihat demo daring | Ikuti kami di Twitter, atau Facebook | Kunjungi sponsor kami :
Jika Anda menggunakan TNT Search dan merasakan manfaatnya, lihat alat analisis premium kami:
Cara termudah untuk menginstal TNTSearch adalah melalui composer:
composer require teamtnt/tntsearch
Sebelum Anda melanjutkan, pastikan server Anda memenuhi persyaratan berikut:
Untuk dapat membuat kueri penelusuran teks lengkap, Anda harus membuat indeks.
Penggunaan:
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 ();
Penting: pengaturan "penyimpanan" menandai folder tempat semua indeks Anda akan disimpan, jadi pastikan Anda memiliki izin untuk menulis ke folder ini jika tidak, Anda mungkin akan mendapatkan pengecualian berikut:
Catatan: Jika kunci utama Anda berbeda dari id
atur seperti:
$ indexer -> setPrimaryKey ( ' article_id ' );
Secara default, kunci utama tidak dapat dicari. Jika Anda ingin membuatnya dapat dicari, jalankan saja:
$ indexer -> includePrimaryKey ();
Mencari frase atau kata kunci itu sepele:
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);
Klausa ORDER BY FIELD penting, jika tidak, mesin database tidak akan mengembalikan hasil dalam urutan yang diperlukan.
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) " );
Ketidakjelasan dapat diubah dengan mengatur variabel anggota berikut:
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 " );
Setelah membuat indeks, Anda tidak perlu mengindeks ulang setiap kali Anda membuat beberapa perubahan pada koleksi dokumen Anda. TNTSearch mendukung pembaruan indeks dinamis.
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 );
Pertama, buat kelas Tokenizer Anda sendiri. Itu harus memperluas kelas AbstrakTokenizer, menentukan nilai $pola pemisahan kata dan harus mengimplementasikan 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 );
}
}
Tokenizer ini akan membagi kata menggunakan spasi, koma, dan titik.
Setelah tokenizer siap, Anda harus meneruskannya ke TNTIndexer
melalui metode setTokenizer
.
$ someTokenizer = new SomeTokenizer ;
$ indexer = new TNTIndexer ;
$ indexer -> setTokenizer ( $ someTokenizer );
Cara lain adalah dengan meneruskan tokenizer melalui konfigurasi:
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 ' );
Anda bebas menggunakan paket ini, tetapi jika paket ini masuk ke lingkungan produksi Anda, kami akan sangat menghargai Anda mengirimkan game PS4 pilihan Anda kepada kami. Dengan cara ini Anda mendukung kami untuk lebih mengembangkan dan menambahkan fitur baru.
Alamat kami adalah: TNT Studio, Sv. Mateja 19, 10010 Zagreb, Kroasia.
Kami akan mempublikasikan semua game yang diterima di sini
Dukung kami dengan donasi bulanan dan bantu kami melanjutkan aktivitas kami. [Menjadi pendukung]
Jadilah sponsor dan dapatkan logo Anda di README kami di Github dengan tautan ke situs Anda. [Menjadi sponsor]
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.
Dari Kroasia dengan ♥ oleh TNT Studio (@tntstudiohr, blog)