TNTSearch هو محرك بحث عن النص الكامل (FTS) مكتوب بالكامل بلغة PHP. يتيح لك التكوين البسيط إضافة تجربة بحث مذهلة في دقائق معدودة فقط. تشمل الميزات:
لقد أنشأنا أيضًا بعض الصفحات التجريبية التي تعرض الاسترجاع المتسامح باستخدام n-grams أثناء العمل. تحتوي الحزمة على مجموعة من الوظائف المساعدة مثل تشابه Jaro-Winkler وCosine لحسابات المسافة. وهو يدعم اللغات الإنجليزية والكرواتية والعربية والإيطالية والروسية والبرتغالية والأوكرانية. إذا لم تكن وحدات التشغيل المدمجة كافية، فإن المحرك يتيح لك توصيل أي جهاز توجيه كرة ثلج متوافق بسهولة. حتى أن بعض شوكات الحزمة تدعم اللغة الصينية. ويرجى المساهمة بلغات أخرى!
على عكس العديد من المحركات الأخرى، يمكن تحديث الفهرس بسهولة دون إعادة الفهرسة أو استخدام دلتا.
عرض تجريبي عبر الإنترنت | تابعونا على تويتر، أو الفيسبوك | زيارة الرعاة لدينا :
إذا كنت تستخدم بحث TNT وتجده مفيدًا، فقم بإلقاء نظرة على أداة التحليلات المميزة لدينا:
أسهل طريقة لتثبيت TNTSearch هي عبر الملحن:
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، وتحديد قيمة النمط $ المنقسمة للكلمات، ويجب تنفيذ 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 );
}
}
سيقوم هذا الرمز المميز بتقسيم الكلمات باستخدام المسافات والفواصل والنقاط.
بعد أن يكون برنامج الرمز المميز جاهزًا، يجب عليك تمريره إلى TNTIndexer
عبر طريقة setTokenizer
.
$ 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. ماتيا 19، 10010 زغرب، كرواتيا.
سننشر جميع الألعاب المستلمة هنا
ادعمنا بتبرع شهري وساعدنا على مواصلة أنشطتنا. [كن داعمًا]
كن راعيًا واحصل على شعارك على ملف README الخاص بنا على Github مع رابط لموقعك. [كن راعيًا]
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.
من كرواتيا مع ♥ بواسطة TNT Studio (@tntstudiohr، blog)