Yii2-elasticsearch的简单使用

首先自己先根据GitHub上的yii2-elasticsearch进行安装,对elasticsearch一些基本的文档内容要大体有些了解,可以进官网进行查看文档,这里就不过多介绍,直接上有关Yii2源码部分,一看就懂。git​​​​​​​GitHub - yiisoft/yii2-elasticsearch: Yii 2 Elasticsearch extensionYii 2 Elasticsearch extension. Contribute to yiisoft/yii2-elasticsearch development by creating an account on GitHub.https://github.com/yiisoft/yii2-elasticsearch/model部分:

<?php

namespace app\models\es_models;

use yii\elasticsearch\ActiveRecord;


class Document extends ActiveRecord
{
    public static function index()
    {
        return 'document';//设置文档名称,不设置默认带s结尾
    }

    //指定文档类型
    public static function type()
    {
        return '_doc';
    }

    //指定文档属性
    public function attributes()
    {
        return ['id', 'title','content','status','author'];
    }

    public static function getMapping()
    {
        return [
                    'properties' => [
                        'id'=> ['type' => 'integer'],
                        'title'=> ['type' => 'text','analyzer'=>'ik_smart'],
                        'content'=> ['type' => 'text','analyzer'=>'ik_smart'],
                        'status'=> ['type' => 'integer'],
                        'author'=> ['type' => 'text','analyzer'=>'ik_smart'],
                    ]
               ];
    }

    /**
     * Create this model's index
     */
    public static function createIndex()
    {
        $db = static::getDb();
        $command = $db->createCommand();
        $command->createIndex(static::index(), [
            'mappings' => static::getMapping(),
        ]);
    }

    public function checkIndex()
    {
        $db = self::getDb();
        $command = $db->createCommand();
        if (!$command->indexExists(self::index())) {
            return false;
        }else{
            return true;
        }
    }

}

 控制器部分:

<?php

namespace app\controllers;

use app\models\es_models\Document;
use yii\web\Controller;
use Yii;

class EsSearchController extends Controller
{
    //创建Index
    public function actionCreateIndex()
    {
        $es = new Document();
        if(!$es->checkIndex()){
            $es::createIndex();
            echo '创建成功';
            die;
        }
        echo '已创建';die;
    }

    //搜索
    public function actionEsSearch()
    {
        $page = Yii::$app->request->get('page') ?: 1;
        $page_size = Yii::$app->request->get('pageSize') ?: 10;
        $keyword = Yii::$app->request->get('keyword') ?: '';
        $offset = ($page - 1) * $page_size;
        $es = new Document();
        //此处组装query有点小坑,可以根据es文档把json转为数组,不然容易出错
        //此处的条件相当于where status in (1,2) and (title like '%keyword%' or content like '%keyword%')
        $query = [
            'bool' => [
                'must' => [
                    [
                        'terms' => [
                            'status' => [1,2],
                        ],
                    ],
                    [
                        'bool' => [
                            'should' => [
                                [
                                    'match' => [
                                        'title' => [
                                            'query' => $keyword,
                                            'boost' => 1, //权重
                                        ],
                                    ]
                                ],
                                [
                                    'match' => [
                                        'content' => [
                                            'query' => $keyword,
                                            'boost' => 1, //权重
                                        ],
                                    ]
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ];

        $hightlight = [
            "pre_tags" => ['<span class="text-danger">'],//要高亮的颜色css的class
            "post_tags" => ['</span>'],
            "fields" => [
                'content' => new \stdClass(),
                'title' => new \stdClass()
            ]
        ];
        $es_data = $es::find()
            ->source(['id', 'title', 'content', 'status','author'])
            ->query($query)
            ->highlight($hightlight)
            ->offset($offset)
            ->limit($page_size)
            ->asArray()
            ->all();
        echo json_encode($es_data);//打完收工
        exit;
    }

    //搞点数据测试
    public function actionSetEsContent()
    {
        $Document = new Document();
        $Document->id = 1; // setting primary keys is only allowed for new records
        $Document->title = '大佬'; // attributes can be set one by one
        $Document->content = '大佬6666';
        $Document->status = 1;
        $Document->author = '牛皮';
        $res = $Document->save();
    }
}

先执行创建index的方法:

可以看到kibana后台界面已经成功创建出document。(kibana是es的可视化界面可以在官网查看安装文档,安装对应es版本即可)

 下一步我们执行创建假数据的接口actionSetEsContent,改变数据执行多几遍搞多几条数据,开发时可以写一个同步文章的命令行接口,定时执行把文章更新到es。

 此时kibana里已经有一条数据。

最后我们执行搜索接口actionEsSearch

 打完收工。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值