本来想写一遍关于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
// 移动目录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秒左右才给出搜索结果,问题具体出在哪儿了我不清楚,这是时候我看见这搜索速度,看这个表情表就能理解了
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。