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,博客)