TNTSearch は、完全に PHP で書かれた全文検索 (FTS) エンジンです。シンプルな構成により、わずか数分で素晴らしい検索エクスペリエンスを追加できます。特徴は次のとおりです。
また、N グラムを使用した寛容な検索を示すデモ ページもいくつか作成しました。このパッケージには、距離計算のための Jaro-Winkler やコサイン類似度などのヘルパー関数が多数含まれています。英語、クロアチア語、アラビア語、イタリア語、ロシア語、ポルトガル語、ウクライナ語のステミングをサポートしています。組み込みのステマーでは不十分な場合は、このエンジンを使用して、互換性のある Snowball ステマーを簡単にプラグインできます。パッケージの一部のフォークは中国語もサポートしています。そして他の言語でも貢献してください!
他の多くのエンジンとは異なり、インデックスの再作成やデルタの使用を行わずに、インデックスを簡単に更新できます。
オンラインデモを見る| Twitter または Facebook でフォローしてください|スポンサーを訪問してください:
TNT Search を使用していて便利だと感じている場合は、プレミアム分析ツールをご覧ください。
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 の README でロゴをサイトへのリンクとともに取得してください。 【スポンサーになる】
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。
クロアチアから♥ by TNT Studio (@tntstudiohr、ブログ)