PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > CMS教程 > Fastadmin

PHP模糊搜索TNTSearch系统的集成与使用

管理员 2024-12-14
Fastadmin
7

本来想写一遍关于sphinx的文章

写着写着发现不对劲这玩意对中文的支持很差劲,而且中文包年久失修,直接就放弃了
不过想想还是贴出来思路吧,如下

鉴于xunsearch安装起来遇到一个openssl版本过高的错误,所以决定换成sphinx,这里这存个文档
先去sphinx官网下载一个最新的版本
http://sphinxsearch.com/
我服务器是linux CentOS 8.4 所以直接最新版本的linux 3.4.1 下面是下载链接
http://sphinxsearch.com/files/sphinx-3.4.1-efbcc65-linux-amd64.tar.gz

总所周知 我用的是linux服务器 所以直接

// 下载wget http://sphinxsearch.com/files/sphinx-3.4.1-efbcc65-linux-amd64.tar.gz// 解压tar zxvf sphinx-3.4.1-efbcc65-linux-amd64.tar.gz

服务器用的是宝塔面板 网上说要移到mysql同目录下 so

// 移动目录mv sphinx-3.4.1 /www/server/sphinx

接下来直接看看官方的demo

cd /www/server/sphinx/ectls // example.sql  sphinx.conf.dist  sphinx-min.conf.dist 

这里三个文件第一个就是demo的数据库 后面是配置信息
到这里 然后我就放弃了

我就想这么麻烦吗?难道没有更加简单高效的了吗?
当然有。于是乎我就找到了TNTsearch
是不是听起来就很霸气,名副其实的轻便搜索解决方案,就是一个php的类库而已,这次够简单吧。
开源地址如下
https://github.com/teamtnt/tntsearch

看了一下说明 这里是说要我用composer的方式引入

composer require teamtnt/tntsearch

以我的尿性当然这我就不干了,我要做成插件的话还要用户去手动引入吗?不存在的
这里我直接把整个项目下载下来。

下载后解压看了一下命名空间 直接把
主目录改成 TeamTNT
src子目录改成 TNTSearch

然后当时是在插件初始化里加上

            if(!class_exists("TeamTNTTNTSearch")){            thinkLoader::addNamespace('TeamTNTTNTSearch', ADDON_PATH . 'analy' . DS . 'library' . DS . 'TeamTNT' . DS . 'TNTSearch'.DS);        }

这里我看了一下还需要一个分词库 这里我就用推荐的这个《结巴》类库把,老办法下载下来看一下命名空间
https://github.com/fukuball/jieba-php
这里只要src的文件目录 Fukuball
里面的class子目录改成 Jieba

还是老规矩 初始化里加上 引入

            if(!class_exists("FukuballJieba")){            thinkLoader::addNamespace('FukuballJieba', ADDON_PATH . 'analy' . DS . 'library' . DS . 'Fukuball' . DS . 'Jieba'.DS);        }

以下填坑
multi-array这个子目录也要改成Tebru放到Fukuball的目录下并增加配置

            if(!class_exists("FukuballTebru")){            thinkLoader::addNamespace('FukuballTebru', ADDON_PATH . 'analy' . DS . 'library' . DS . 'Fukuball' . DS . 'Tebru'.DS);        }

分词库比较大 所以建立索引的时候 PHP设置的 memory_limit值适当需要大一点比如分配个1024M

到这里在参考了
https://www.jianshu.com/p/652026d8af2a
的文章下,搭建的还算比较顺利,
然后分别在插件的library目录下创建了三个类分别是

<?php// +----------------------------------------------------------------------// | FileName: TNTSearchHelper.php// +----------------------------------------------------------------------// | Date: 2021/12/5 23:42:23// +----------------------------------------------------------------------// | Author: 默毅 <moyi@mymoyi.cn>// +----------------------------------------------------------------------// | Notes: // +----------------------------------------------------------------------namespace addonsanalylibrary;use TeamTNTTNTSearchTNTSearch;class TNTSearchHelper{    protected $indexName="text";    protected $config=[];    protected $tnt;    public function __construct()    {        $config=[            'driver'    => 'mysql',            'host'      => config("database.hostname"),            'database'  => config("database.database"),            'username'  => config("database.username"),            'password'  => config("database.password"),            'storage'   => ROOT_PATH.'public/tntsearch/examples/',            'stemmer'   => TeamTNTTNTSearchStemmerPorterStemmer::class//optional        ];        $this->config=$config;        $this->tnt = new TNTSearch;        $this->tnt->loadConfig($this->config);    }    /**     * 创建索引     * @param $token     *     */    public function createIndex($token){        $indexer = $this->tnt->createIndex($this->indexName);        $indexer->query('SELECT id, text FROM my_moyicosmic_cosmos;');        $indexer->setTokenizer($token);        $indexer->inMemory = false;        $indexer->run();    }    /**     *     * @param $keyword     * <a href="https://ask.fastadmin.net/u/20697" data-type="user" data-id="20697" data-toggle="popover" data-title="Return">@return</a> array     * @throws TeamTNTTNTSearchExceptionsIndexNotFoundException     */    public function search($keyword){        $tnt=$this->tnt;        $tnt->selectIndex($this->indexName);        $tnt->fuzziness = true;        $tnt->setTokenizer();        $res = $tnt->search($keyword);        return $res;    }}
<?php// +----------------------------------------------------------------------// | FileName: JiebaHelper.php// +----------------------------------------------------------------------// | Date: 2021/12/6 00:29:09// +----------------------------------------------------------------------// | Author: 默毅 <moyi@mymoyi.cn>// +----------------------------------------------------------------------// | Notes: // +----------------------------------------------------------------------namespace addonsanalylibrary;use FukuballJiebaJieba;use FukuballJiebaFinalseg;use TeamTNTTNTSearchSupportTokenizerInterface;class JiebaHelper implements TokenizerInterface{    public function __construct(array $options = [])    {        Jieba::init($options);        if (isset($options['user_dict'])) {            Jieba::loadUserDict($options['user_dict']);        }        Finalseg::init($options);    }    public function tokenize($text, $stopwords = [])    {        $tokens = Jieba::cutForSearch($text);        return $tokens;    }    public function getPattern(){    }}
<?php// +----------------------------------------------------------------------// | FileName: SearchHelper.php// +----------------------------------------------------------------------// | Date: 2021/12/6 00:32:17// +----------------------------------------------------------------------// | Author: 默毅 <moyi@mymoyi.cn>// +----------------------------------------------------------------------// | Notes: // +----------------------------------------------------------------------namespace addonsanalylibrary;use addonsanalylibraryJiebaHelper;use addonsanalylibraryTNTSearchHelper;class SearchHelper{    /**     * 初始化索引文件     */    public function index(){        $token = new JiebaHelper();        (new TNTSearchHelper())->createIndex($token);    }    /**     * 搜索     * @throws TeamTNTTNTSearchExceptionsIndexNotFoundException     *     *     */    public function search(){        $res= (new TNTSearchHelper())->search('哈哈 自拍');        print_r($res);    }}

这个类库我采了1万条数据进去,大楷等了3/4秒左右才给出搜索结果,问题具体出在哪儿了我不清楚,这是时候我看见这搜索速度,看这个表情表就能理解了

325e4b4c-8843-4fe0-a948-36c0f958ec41.gif


希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部