TNTSearch 是一個完全用 PHP 寫的全文搜尋 (FTS) 引擎。簡單的配置即可讓您在短短幾分鐘內添加令人驚嘆的搜尋體驗。特點包括:
我們也創建了一些示範頁面,展示了使用 n 元語法進行的寬容檢索。該套件有一堆輔助函數,例如 Jaro-Winkler 和用於距離計算的餘弦相似度。它支援英語、克羅埃西亞語、阿拉伯語、義大利語、俄語、葡萄牙語和烏克蘭語的詞幹提取。如果內建詞幹分析器還不夠,引擎可以讓您輕鬆插入任何相容的雪球詞幹分析器。該軟體包的某些分支甚至支援中文。請貢獻其他語言!
與許多其他引擎不同,索引可以輕鬆更新,無需重新索引或使用增量。
查看線上示範 |在 Twitter 或 Facebook 上關注我們|參觀我們的贊助商:
如果您正在使用 TNT 搜尋並發現它很有用,請查看我們的進階分析工具:
安裝 TNTSearch 最簡單的方法是透過 Composer:
composer require teamtnt/tntsearch
在繼續之前,請確保您的伺服器符合以下要求:
為了能夠進行全文搜尋查詢,您必須建立索引。
用法:
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 ();
重要提示:「儲存」設定標記了將保存所有索引的資料夾,因此請確保具有寫入此資料夾的權限,否則您可能會拋出以下例外:
注意:如果您的主鍵與id
不同,請將其設為:
$ indexer -> setPrimaryKey ( ' article_id ' );
預設情況下,主鍵不可搜尋。如果你想讓它可搜索,只需運行:
$ indexer -> includePrimaryKey ();
搜尋短語或關鍵字很簡單:
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);
ORDER BY FIELD 子句很重要,否則資料庫引擎將不會以所需順序傳回結果。
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) " );
可以透過設定以下成員變數來調整模糊性:
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 " );
建立索引後,每次對文件集合進行一些更改時都不需要重新索引它。 TNTSearch 支援動態索引更新。
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 );
首先,建立您自己的 Tokenizer 類別。它應該擴展 AbstractTokenizer 類,定義單字分割 $pattern 值並且必須實作 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 );
}
}
該分詞器將使用空格、逗號和句點分割單字。
準備好標記產生器後,您應該透過setTokenizer
方法將其傳遞給TNTIndexer
。
$ someTokenizer = new SomeTokenizer ;
$ indexer = new TNTIndexer ;
$ indexer -> setTokenizer ( $ someTokenizer );
另一種方法是透過配置傳遞標記生成器:
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 ' );
您可以自由使用此軟體包,但如果它適用於您的生產環境,我們將非常感謝您向我們發送您選擇的 PS4 遊戲。透過這種方式,您可以支援我們進一步開發和添加新功能。
我們的地址是:TNT Studio, Sv。 Mateja 19, 10010 薩格勒布, 克羅埃西亞。
我們將在這裡發布所有收到的遊戲
每月捐款支持我們,並幫助我們繼續我們的活動。 [成為支持者]
成為贊助商並在 Github 上的自述文件中獲取您的徽標以及指向您網站的連結。 [成為贊助商]
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。
來自克羅埃西亞與 TNT Studio 的 ♥(@tntstudiohr,部落格)