[新功能]全站搜索功能上线

公告 · forecho · 于 3年前 发布 · 5930 次阅读

本搜索自豪的采用 迅搜,对 Yii 支持非常友好,详情参照官方提供的 Xunsearch SDK for PHP。目前只支持帖子标题和内容搜索。

如何安装 Xunsearch

我只说一个大概,详情请参照官方文档。

首先要安装 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

Yii2 如何使用 Xunsearch

首先要在配置文件 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 搜索基本功能

如何导入以前的数据到 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 

查看 Xunsearch 搜索当前导入的词库

在 GetYii 根目录运行:

php vendor/hightman/xunsearch/util/Quest.php -p frontend/config/search.ini 'xx'
本帖已被设为精华帖!
共收到 15 条回复 新功能 GetYii xunsearch
xijinping#13年前 0 个赞

请问楼主大人,在windows下改如何安装配置啊?求教中

forecho#23年前 0 个赞

@xijinping #1楼 windows 不能用搜索 (⊙﹏⊙)b

其他的应该还好

xijinping#33年前 0 个赞

@forecho 那请问有什么别的解决方法没啊?

forecho#43年前 0 个赞

@xijinping #3楼 windows 应该也可以,具体你要去看 Xunsearch 的文档了, http://www.xunsearch.com/doc/php/guide/start.installation

反正部署上线应该是 Linux 吧?如果不嫌麻烦折腾下也行。

  • 首先你要在 windows 安装 Xunsearch
  • 可能需要改 frontend/config 目录下添加 xunsearch 配置文件 search.ini
ouewqa#53年前 0 个赞

是否支持分布式搜索?

hightman#63年前 0 个赞

@ouewqa #5楼 支持啊!xapian本身就支持 remote 库,这是高级用法,需要对 xapian 有比较深入的了解。

XUNSEARCH本身就是C/S架构,也很容易做分布式部署。

不管怎么样,分布式搜索不是泛泛而谈或者有一个固定的模式,需要根据项目的实际情况去做架构做设计 。

Magician#73年前 0 个赞

现在好像还不能使用图片发布信息呢!

forecho#83年前 0 个赞

@Magician #7楼 现在还不支持上传图片功能,这个后期会支持的,现在可以使用图床发布图片

Magician#93年前 0 个赞

@forecho 图床常常会出错 !

forecho#103年前 0 个赞

@Magician #9楼 那只能说你找的图床不靠谱,原图被删了。我推荐这个 http://imgur.com/

ouewqa#113年前 0 个赞

我使用虚拟机来安装xunsearch,但连接的时候,总显示:

192.168.42.131:8383 [10061] 由于目标计算机积极拒绝,无法连接。

jasonjw#122年前 0 个赞

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

forecho#132年前 0 个赞

@jasonjw #12楼 你这个是 update?是不是因为 xunsearch 中没有这个 id?你可以参照 GetYii 来写

jasonjw#142年前 0 个赞

@forecho #13楼 已成功找到,是我的配置文件路径没写好,还有个新问题,我运行到model->save()的方法时,通过跟踪,发现是连接成功的,但在执行fsockopen函数的时候报错,错误內容是框框,无法知道什么问题,有什么新建议或什么方法可以转换一下错误内容?

fecommerce#152年前 0 个赞

顶下楼主分享

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册