Laravel中基于XunSearch的中文搜索解决方案

前言

分词搜索始终不是那么好解决,但是基本也有现成的解决方案。在我博客之前的文章我也介绍过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代码端连接服务,新建索引以及搜索,还有如何自动添加新的索引。

安装XunSearch

官网文档地址: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端口的,你们需要在安全组里面打开。

PHP端安装

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://learnku.com/articles/16958/laravel-5-software-package-based-on-xunsearch-sdk-supports-full-spelling-spelling-abbreviation-fuzzy-search-hot-search-search-tips

或这也行: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://www.misiyu.cn/article/113.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券