TNTSearch เป็นเครื่องมือค้นหาข้อความแบบเต็ม (FTS) ที่เขียนด้วย PHP ทั้งหมด การกำหนดค่าที่เรียบง่ายช่วยให้คุณเพิ่มประสบการณ์การค้นหาที่น่าทึ่งได้ในเวลาเพียงไม่กี่นาที คุณสมบัติได้แก่:
นอกจากนี้เรายังสร้างหน้าสาธิตบางหน้าที่แสดงการดึงข้อมูลแบบยอมรับได้ด้วยการทำงานของ n-gram แพ็คเกจนี้มีฟังก์ชันตัวช่วยมากมาย เช่น ความคล้ายคลึงกันของ Jaro-Winkler และ Cosine สำหรับการคำนวณระยะทาง รองรับการสะกดคำในภาษาอังกฤษ โครเอเชีย อารบิก อิตาลี รัสเซีย โปรตุเกส และยูเครน หากตัวตั้งต้นในตัวไม่เพียงพอ เครื่องยนต์จะช่วยให้คุณสามารถเสียบตัวตั้งต้นก้อนหิมะที่เข้ากันได้ได้อย่างง่ายดาย ส้อมบางอันของแพ็คเกจรองรับภาษาจีนด้วยซ้ำ และโปรดสนับสนุนภาษาอื่น ๆ !
แตกต่างจากเอ็นจิ้นอื่นๆ ตรงที่ดัชนีสามารถอัปเดตได้อย่างง่ายดายโดยไม่ต้องทำดัชนีใหม่หรือใช้เดลต้า
ดู การสาธิตออนไลน์ | ติดตามเรา บน Twitter หรือ Facebook | เยี่ยมชมผู้สนับสนุนของเรา :
หากคุณใช้ TNT Search และพบว่ามีประโยชน์ ลองดูที่เครื่องมือวิเคราะห์ระดับพรีเมียมของเรา:
วิธีที่ง่ายที่สุดในการติดตั้ง 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 กำหนดค่าการแบ่งคำ $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 );
}
}
โทเค็นเซอร์นี้จะแบ่งคำโดยใช้ช่องว่าง เครื่องหมายจุลภาค และจุด
หลังจากที่คุณเตรียม tokenizer แล้ว คุณควรส่งต่อไปยัง 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. Mateja 19, 10010 ซาเกร็บ, โครเอเชีย
เราจะเผยแพร่เกมที่ได้รับทั้งหมดที่นี่
สนับสนุนเราด้วยการบริจาครายเดือนและช่วยเราดำเนินกิจกรรมของเราต่อไป [มาเป็นผู้สนับสนุน]
ร่วมเป็นผู้สนับสนุนและรับโลโก้ของคุณบน README บน Github พร้อมลิงก์ไปยังเว็บไซต์ของคุณ [มาเป็นสปอนเซอร์]
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม
จากโครเอเชียด้วย ♥ โดย TNT Studio (@tntstudiohr บล็อก)