jaafarazizi/aseclassification

一个功能齐全的PHP全文搜索引擎

v2.1.0 2019-05-08 08:27 UTC

README

Latest Version on Packagist Total Downloads Software License Build Status Slack Status

TNTSearch Banner

TNTSearch

TNTSearch 是一个完全用PHP编写的功能齐全的全文搜索引擎。它简单的配置允许您只需几分钟即可将令人惊叹的搜索体验添加到您的网站。它还具有内置的地理搜索和文本分类器。其他功能包括

  • 模糊搜索
  • 即写即搜功能
  • 地理搜索
  • 文本分类
  • 词干提取
  • 自定义标记化器
  • bm25 排名算法
  • 布尔搜索
  • 结果高亮显示

我们还创建了一些演示页面,展示了使用n-gram的宽容检索功能。该包有一系列辅助函数,如jaro-winkler和余弦相似度,用于距离计算。它支持英语、克罗地亚语、阿拉伯语、意大利语、俄语、葡萄牙语和乌克兰语的词干提取。如果内置的词干提取器不足以满足需求,引擎允许您轻松地插入任何兼容的snowball词干提取器。该包的一些分支甚至支持中文。

与其他许多引擎不同,索引可以很容易地更新,而无需重新索引或使用增量。

查看 在线演示  |  关注我们Twitter,或 Facebook  |  访问我们的赞助商

演示

教程

在 Open Collective 上支持我们

安装

安装 TNTSearch 最简单的方法是通过 composer

composer require teamtnt/tntsearch

要求

在继续之前,请确保您的服务器满足以下要求

  • PHP >= 7.1
  • PDO PHP 扩展
  • SQLite PHP 扩展
  • mbstring PHP 扩展

示例

创建索引

为了能够执行全文搜索查询,您必须创建一个索引。

用法

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();

重要: "storage" 设置标记了所有索引将保存的文件夹,请确保您有权限写入此文件夹,否则您可能会遇到以下异常

  • [PDOException] SQLSTATE[HY000] [14] 无法打开数据库文件 *

注意:如果您的主键不是 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 类以实现 TokenizerInterface 接口。

use TeamTNT\TNTSearch\Support\TokenizerInterface;

class SomeTokenizer implements TokenizerInterface {

    public function tokenize($text) {
        return preg_split("/[^\p{L}\p{N}-]+/u", strtolower($text), -1, PREG_SPLIT_NO_EMPTY);
    }
}

与原始版本相比,这里的区别在于正则表达式包含一个连字符 [^\p{L}\p{N}-]

在准备好分词器后,您的 TNTIndexerTNTSearch 类应该使用它。

$someTokenizer = new SomeTokenizer;

$indexer = new TNTIndexer;
$indexer->setTokenizer($someTokenizer);

TNTSearch 类中做同样的操作。

$someTokenizer = new SomeTokenizer;

$tnt = new TNTSearch;
$tnt->setTokenizer($someTokenizer);

地理搜索

索引

$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');

驱动器

PS4Ware

您可以使用此软件包,但如果它进入您的生产环境,我们非常希望您能寄给我们一款您选择的 PS4 游戏。这样,您就能支持我们进一步开发并添加新功能到这个软件包。

我们的地址是:TNT Studio,Sv. Mateja 19,10010 萨格勒布,克罗地亚。

我们将把所有收到的游戏发布在我们的公司网站上。

支持 OpenCollective OpenCollective

Buy Me a Coffee at ko-fi.com

赞助商

通过每月捐赠支持我们,帮助我们继续活动。[成为赞助商]

赞助商

成为赞助商,并在我们的 Github README 中获得您的标志和链接到您网站的链接。[成为赞助商]

鸣谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件

由 TNT Studio(@tntstudiohr博客)在克罗地亚用爱心制作