搜索支持评论的实现

技巧库 · kkkiii · 于 4年前 发布 · 3195 次阅读

当前getyii搜索只支持帖子搜索,那天问forecho为什么不包括评论搜索,forecho指导了下,并鼓励我试一试. 寻着forecho引入Xunsearch,到官网研究了学习一下,getyii代码研究了一下,实现了这个改动,分享在这里,若能对大家进一步深入了解Xunsearch有一点点的帮助则甚慰。

1 新建一个xunsearch项目 1.1 ini配置 frontend/config下面再加个XunSearch项目配置文件:

project.name = commentsearch
project.default_charset = utf-8
server.index = 8383
server.search = 8384
[id]
type = id
 
[post_id]
index = self
tokenizer = full
 
[comment]
type = body
 
[status]
index = self
tokenizer = full
 
[updated_at]
type = numeric

1.2 model类 在common/models加个 CommentSearch的model:

<?php
namespace common\models;
use yii\data\ActiveDataProvider;
 
class CommentSearch extends \hightman\xunsearch\ActiveRecord
{
    public function search($keyword)
    {
        $query = self::find()->where($keyword)->andWhere(['status' => [1]]);
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'defaultOrder' => [
                    'updated_at' => SORT_DESC,
                ]
            ]
        ]);
 
        return $dataProvider;
    }
}

2 导入评论的数据到xunsearch里 cd到XunSearch包Util下运行这个 :

php Indexer.php --rebuild --source=mysql://root:yourpass@localhost/getyii --sql="SELECT id,post_id,comment,status, updated_at FROM  post_comment" --project=commentsearch

3 在post_comment onsave时同步到xunsearch里 每当插入和更新post_comment时候你要同步到XunSearch里,找到这个model, common\models\PostComment.php 这么改:

public function afterSave($insert, $changedAttributes)
{
    parent::afterSave($insert, $changedAttributes);
    Yii::$app->cache->set('comment' . $this->id, $this, 0);
    
    if (isset(Yii::$app->params['setting']) && Yii::$app->params['setting']['xunsearch']) {
        if ($insert) {
            $search = new CommentSearch();
            $search->id = $this->id;
            $search->status = self::STATUS_ACTIVE;
        } else {
            $search = CommentSearch::findOne($this->id);
            if (!$search) {
                // 如果立即修改 会因为在 xunsearch 找不到而不能 save
                return false;
            }
            $search->status = $this->status;
        }
        $search->post_id = $this->post_id;
        $search->comment = $this->comment;
        $search->updated_at = $this->updated_at;
        $search->save();
    }
    
}

4 改下页面和逻辑让效果出来 4.1 search bar调整 /frontend/widgets/views/nav.php 这个文件加上搜索选择

4.2 controller调整

frontend/modules/topic/controllers/DefaultController.php 这里调整,判断后转到不同的view

public function actionSearch()
{

    $keyword = Yii::$app->request->get('keyword');
    $forwhat = Yii::$app->request->get('forwhat');

    if (empty($keyword)) $this->goHome();

    // 记录log
    $model = new SearchLog();
    $model->setAttributes([
        'user_id' => (Yii::$app->user->isGuest) ? '' : Yii::$app->user->identity->getId(),
        'keyword' => $keyword,
        'created_at' => time(),
    ]);

    $model->save();
    
    $searchModel = null; 
    if (strcmp($forwhat, 'topic')===0) {
           $searchModel = new Search();
           
           $dataProvider = $searchModel->search($keyword);
           return $this->render('search', [
//                    'searchModel' => $searchModel,
               'dataProvider' => $dataProvider,
             
           ]);
           
    }else  if (strcmp($forwhat, 'comment')===0) {
          $searchModel = new CommentSearch();
          $dataProvider = $searchModel->search($keyword);
//               var_dump($dataProvider) ;exit() ;
          return $this->render('comment_search', [
//                   'searchModel' => $searchModel,
              'dataProvider' => $dataProvider,
            
          ]);
    }
    
} 

4.3 view调整 我在这个位置增加了俩view,大家可照着原来的文件改出来这俩新的即可

下面我把_comment_search粘在下面:

<?php
 
use yii\helpers\Html;
// var_dump($model);exit() ;
/* @var $this yii\web\View */
?>
<div class="media">
    <div class="media-body">
        <div class="media-heading">
            <?= Html::a (    Html::encode(substr($model->comment,0,60) ),
                ['/topic/default/view', 'id' => $model->post_id], ['comment' => $model->comment]
            ); ?> <span class="title-info"><?= \common\helpers\Formatter::relative($model->updated_at)?></span>
        </div>
    </div>
</div>

最后别忘了打开搜索开关 frontend\config\params.php

'setting' => [
    'xunsearch' => true, // true 表示开启 GetYii xunsearch 搜索功能,默认不开启
],

本文由 kkkiii 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。

本帖已被设为精华帖!
共收到 4 条回复 XunSearch
fecommerce#14年前 0 个赞

xunSearch是什么?

fecommerce#24年前 0 个赞

迅搜(xunsearch) - 开源免费中文全文搜索引擎,有继承好的插件吗?

forecho#34年前 0 个赞

@fecommerce #2楼 有 官方有 Yii2 插件

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