分词搜索始终不是那么好解决,但是基本也有现成的解决方案。在我博客之前的文章我也介绍过Sphinx
分词搜索:CentOS7下安装Sphinx 中文分词【PHP+MySQL】
但确实,对中文支持是很不好,不能用不好来形容,应该是很不好。
然后我如今又看了另一解决方案:XunSearch,经过一番测试,虽然达不到我心中最理想的那种状态。但确实也还行。
我的另一项目,懒盘搜索:https://www.lzpan.com/ 没办法,给用户好的体验,用户才记住你的网站。而此类网站,搜索很关键。
如上我搜索
win10 1903
,效果还行。
本篇文章就来说一下,如何在Laravel中使用XunSearch。
前提说一下:
1、XunSearch需要在Linux服务器安装后台服务
2、XunSearch自带有Sdk,但是和Laravel结合不是很好,所以我们这里推荐一位网友封装的Composer包:https://packagist.org/packages/shaozeming/xunsearch-laravel
但是由于是封装,Xunsearch的部分功能没有实现【也许实现了,但是我不会用,文档也没写。】,但基本的搜索结果,结果条数,耗费时间,新建所有索引,更新一条索引,清空所有索引是实现了的。
以下步骤我们分为服务器端安装XUNSearch,以及在PHP代码端连接服务,新建索引以及搜索,还有如何自动添加新的索引。
官网文档地址:http://www.xunsearch.com/doc/php/guide/start.installation
1、下载压缩包,解压
wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
tar -xjf xunsearch-full-latest.tar.bz2
我的建议是在家目录建立一个xun文件夹,进入xun文件夹运行以上代码。如下:
解压完了会有一个文件夹,
进入执行
cd xunsearch-full-1.4.13 # 此命令是进入解压后的目录,由于您看此篇文章时的版本可能有所不同,请根据具体目录进入。
sh setup.sh # 执行安装脚本
配置安装目录
安装完成
如果你是默认安装目录,也即:/usr/local/xunsearch
那么我们进入
cd /usr/local/xunsearch/bin
执行以下命令的一个,根据你的要求执行:
./xs-ctl.sh -b local start // 监听在本地回环地址 127.0.0.1 上
./xs-ctl.sh -b inet start // 监听在所有本地 IP 地址上
./xs-ctl.sh -b a.b.c.d start // 监听在指定 IP 上
./xs-ctl.sh -b unix start // 分别监听在 tmp/indexd.sock 和 tmp/searchd.sock
由于我是本地服务器,所以我监听本地回环地址即可: ./xs-ctl.sh -b local start
出现以上界面,说明已经监听成功啦,至此服务器端安装xun search完毕。
额外说明的是,腾讯云、阿里云的安全组默认是禁止8383和8384端口的,你们需要在安全组里面打开。
1、安装composer包
前面说了,我不想在laravel里面用官方配置的SDK,不好兼容。用一位网友封装的SDK。
安装
composer require shaozeming/xunsearch-laravel
发布文件vendor
执行
php artisan vendor:publish
找到和xun search
有关的发布文件,我这里是9,输入9发布配置文件。
然后在config目录多了一个xunsearch.php文件,此为配置文件
如何配置,请参考xun search和此composer包的文档:
https://packagist.org/packages/shaozeming/xunsearch-laravel
http://www.xunsearch.com/doc/php/guide/ini.guide
2、执行所有索引
前面Xun Search服务端安装成功了,并且端口是可以正常访问的,那么到了此步就简单了。
$disks = NetDisk::Validate(1)->get()->toArray();
$d = Xunsearch::setDatabase('referrers')->addIndex($disks);
如上,我这里是从Laravel模型中获取所有数据,并且toArray转换为数组(也必须转换为数组),然后将该数组传进addIndex()方法里面就行。
可能直接到了这步,大家有点蒙。我详细说一下,数组里面是的字段和在config/xunsearch.php 配置的字段是一致的。
如上,你的数组里面必须有这配置文件里面写的字段名。
然后上面代码中的setDatabase('referrers')
可以不写,就是默认的;写了的话,那么在配置文件里面就必须有对应的配置。如上图的referrers
。
那么,如何看索引成功没有?
如果你是默认安装位置的话,那进入:/usr/local/xunsearch/data
cd /usr/local/xunsearch/data
查看里面文件夹的大小:du -h
如果这里有几百K以及上M,那么是索引成功了的。
或这也行:https://packagist.org/packages/shaozeming/xunsearch-laravel
其实很简单,看文档里面就有:
//$data = ['id'=>1,'email'=>'123456@ming.com'];
//Xunsearch::updateIndexOne($data); 更新索引
//Xunsearch::setDatabase('student')->updateIndexOne($data); 更新自定义索引数据库索引
用updateIndexOne
方法就行。
你只需要在新建数据后,将该模型toArray,然后传入即可。
$data = $model->toArray(); // 将模型toArray
Xunsearch::updateIndexOne($data); // 更新索引
// 如果你这里是设置了自定义数据库的,那么就要setDatabase('student')
// 也即:Xunsearch::setDatabase('student')->updateIndexOne($data); // 更新索引
就行啦。
但如果你怕影响web端访问速度,那么如何办?
加入队列即可,如何使用队列,请参考我的文章:https://cloud.tencent.com/developer/article/1538361