本搜索自豪的采用 迅搜,对 Yii 支持非常友好,详情参照官方提供的 Xunsearch SDK for PHP。目前只支持帖子标题和内容搜索。
docker run --name xunsearch -d \
-p 8383:8383 -p 8384:8384 \
-v /var/xunsearch/data:/usr/local/xunsearch/data \
hightman/xunsearch:latest
我只说一个大概,详情请参照官方文档。
首先要安装 Xunsearch,安装命令如下:
wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
tar -jxvf xunsearch-full-latest.tar.bz2
cd xunsearch-full-1.4.9 # 注意此处的文件夹名,可能有不一样
sh ./setup.sh
安装完记得要启动 xunsearch 服务程序,示例如下(安装完之后会提示你如何启动):
/home/vagrant/xunsearch/bin/xs-ctl.sh start
首先要在配置文件 frontend/config/main.php
添加 xunsearch 组件:
'components' => [
...
'xunsearch' => [
'class' => 'hightman\xunsearch\Connection', // 此行必须
'iniDirectory' => '@frontend/config', // 搜索 ini 文件目录,默认:@vendor/hightman/xunsearch/app
'charset' => 'utf-8', // 指定项目使用的默认编码,默认即时 utf-8,可不指定
],
...
],
在 frontend/config
目录下添加 xunsearch 配置文件 search.ini
, 下面是 GetYii 的配置:
project.name = getyii
project.default_charset = utf-8
server.index = 8383
server.search = 8384
[topic_id]
type = id
[title]
type = title
[content]
type = body
[status]
index = self
tokenizer = full
[updated_at]
type = numeric
新建一个 Model 文件,GetYii 的 Model 是 common/models/Search.php
里面的代码就跟写 Yii2 一样的:
<?php
namespace common\models;
use yii\data\ActiveDataProvider;
class Search extends \hightman\xunsearch\ActiveRecord
{
public function search($keyword)
{
$query = self::find()->where($keyword)->andWhere(['status' => [1, 2]]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => [
'updated_at' => SORT_DESC,
]
]
]);
return $dataProvider;
}
}
添加新贴子的时候实现自动入库
在 Model 里面用 afterSave 来实现自动更新和插入
public function afterSave($insert)
{
if ($insert) {
$search = new Search();
$search->topic_id = $this->id;
$search->status = self::STATUS_ACTIVE;
} else {
$search = Search::findOne($this->id);
$search->status = $this->status;
}
$search->title = $this->title;
$search->content = $this->content;
$search->updated_at = $this->updated_at;
$search->save();
}
剩下的就是搜索的实现了,更详情代码请参照 GetYii 源码 - 添加xunsearch 搜索基本功能
下面是 GetYii 导入数据的具体实现(记得数据库用户名和密码改要改成自己的):
php vendor/hightman/xunsearch/util/Indexer.php --source=mysql://root:root@localhost/getyii --sql="SELECT id AS topic_id,title,content,status,updated_at FROM post" --project=frontend/config/search.ini
在 GetYii 根目录运行:
php vendor/hightman/xunsearch/util/Quest.php -p frontend/config/search.ini 'xx'
@xijinping #1楼 windows 不能用搜索 (⊙﹏⊙)b
其他的应该还好
@forecho 那请问有什么别的解决方法没啊?
@xijinping #3楼 windows 应该也可以,具体你要去看 Xunsearch 的文档了, http://www.xunsearch.com/doc/php/guide/start.installation
反正部署上线应该是 Linux 吧?如果不嫌麻烦折腾下也行。
frontend/config
目录下添加 xunsearch 配置文件 search.ini
@forecho 图床常常会出错 !
@Magician #9楼 那只能说你找的图床不靠谱,原图被删了。我推荐这个 http://imgur.com/
public function afterSave($update)
{
$search = new Search();
$q = $search->title;
$search->topic_id = $this->id;
$search->title = $this->title;
$search->content = $this->content;
$search->save();
}
我在写afterSave的时候,调用search这个moel的时候提示 XSException
Missing field of type ID
怎么解决? 我的search.ini内容 project.name = hiramyii project.default_charset = utf-8 server.index = 192.168.31.22:8383 server.search = 192.168.31.22:8384
[topic_id] type = id
[title] type = title
[content] type = body
[status] index = self tokenizer = full
[updated_at] type = numeric