您好,欢迎来到 猿书

yii2使用xunsearch搜索功能

易大师 2016-07-25 1855次浏览 1条评论 0 打赏作者 0 0
如何安装 Xunsearch我只说一个大概,详情请参照官方文档。 首先要安装 Xunsearch,安装命令如下: wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 tar -jxvf xunsearch-full...

如何安装 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 服务程序,示例如下(安装完之后会提示你如何启动):
你的安装目录/xunsearch/bin/xs-ctl.sh start

Yii2 如何使用 Xunsearch

首先要在配置文件 frontend/config/main.php 添加 xunsearch 组件:

'components' => [
    ...
    'xunsearch' => [
        'class' => 'hightman\xunsearch\Connection', // 此行必须
        'iniDirectory' => '@common/config',    // 搜索 ini 文件目录,默认:@vendor/hightman/xunsearch/app
        'charset' => 'utf-8',   // 指定项目使用的默认编码,默认即时 utf-8,可不指定
    ],
    ...
],

common/config 目录下添加 xunsearch 配置文件 search.ini, 下面是 yii2cmf 配置:

project.name = yii2cmf
project.default_charset = utf-8
server.index = 8383
server.search = 8384
[id]
type = id
[title]
type = title
[content]
type = body
[status]
index = self
tokenizer = full
[published_at]
type = numeric

新建一个 Model 文件,yii2cmf 的 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]);
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'defaultOrder' => [
                    'published_at' => SORT_DESC,
                ]
            ]
        ]);
        return $dataProvider;
    }
}

添加新文章的时候实现自动入库

创建XsBehavior并绑定到ArticleData模型里

<?php
namespace common\behaviors;
use common\models\Article;
use common\models\Search;
use yii\base\Behavior;
use yii\db\ActiveRecord;
class XsBehavior extends Behavior
{
    public function events()
    {
        return [
            ActiveRecord::EVENT_AFTER_INSERT => [$this, 'afterSaveInternal'],
            ActiveRecord::EVENT_AFTER_UPDATE => [$this, 'afterSaveInternal']
        ];
    }
    public function afterSaveInternal($event)
    {
        $article = Article::findOne(['id' => $event->sender->id]);
        if (!empty($article)) {
            if ($event->name == 'afterInsert') {
                $search = new Search();
                $search->id = $event->sender->id;
            } else {
                $search = Search::findOne($event->sender->id);
            }
            $search->status = $article->status;
            $search->title = $article->title;
            $search->content = $event->sender->content;
            $search->published_at = $article->published_at;
            $search->save();
        }
    }
}

剩下的就是搜索的实现了,更详情代码请参照 yii2cmf 源码

如何导入以前的数据到 Xunsearch

下面是 yii2cmf 导入数据的具体实现(记得数据库用户名和密码,库名要改成自己的):

php vendor/hightman/xunsearch/util/Indexer.php --source=mysql://root:root@localhost/yii --sql="SELECT a.id,a.title,d.content,a.status,a.published_at FROM pop_article a INNER JOIN pop_article_data d ON d.id=a.id" --project=common/config/search.ini

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

在 yii2cmf 根目录运行:

php vendor/hightman/xunsearch/util/Quest.php -p common/config/search.ini 'keyword'

最后,源码默认不开启xunsearch搜索,如果要开启,需要自己安装xunsearch服务端,然后修改.env里SEARCH_ENGINE为xunsearch

0

1 条评论

  • 一休 发表于 2018-11-14 16:12

    Wrong format of DB connection paramet 帮帮忙