视频教程分类
推荐视频教程
  • Laraval 9 学习正当时—保姆级教程,想学不会都难!Laraval 9 学习正当时—保姆级教程,想学不会都难!
  • 千万级数据并发解决方案(理论+实战)千万级数据并发解决方案(理论+实战)
  • Laravel基础与实战(模块化)Laravel基础与实战(模块化)
  • UNI-APP开发(仿饿了么)UNI-APP开发(仿饿了么)
  • 首页 >后端开发 >php教程 > 正文

    Yii2-elasticsearch 怎么用啊?

    原创2022-05-13 11:42:391980 关注公众号:每天精选资源文章推送
    Yii2-elasticsearch扩展为Yii2.0框架提供了Elasticsearch集成;它包括基本的查询/搜索支持,还实现了允许用户在 Elasticsearch 中存储活动记录的模式。下面本篇文章就来和大家了解怎么使用Yii2-elasticsearch扩展,进行ElasticSearch 搜索!

    课程推荐→:《elasticsearch全文搜索实战》(实战视频)

    来自课程《千万级数据并发解决方案(理论+实战)》

    想把自己的博客用上 ElasticSearch 搜索,用的是 Yii2-elasticsearch 扩展

    搞了半天不会用,没搞明白 elasticsearch 是个怎么回事,是要把 Mysql 中的数据弄到 ES 中去吗?

    难道每次都要到msql中去把数据找出来,再一个一个赋值给 ES 吗?

    <code>
    $posts = Post::find()->all();
     
    $postElastic = new PostElastic();
    $postElastic->attributes = ['name' => $postElastic[0]->name];
    </code>

    要像上面这样嘛?那也太蛋疼了吧

    但是直接 Contents::find()->all() 查出来的也没有数据,

    <code>
    class Contents extends \yii\elasticsearch\ActiveRecord
    {   
        public function attributes()
        {
            return ['id', 'title', 'slug', 'created_at', 'text', 'type', 'status'];
        }
     
    }
    </code>

    回复内容:

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

    1、安装yii2-elasticsearch

    根据GitHub上的yii2-elasticsearch进行安装

    yii2-elasticsearch的GitHub地址:https://github.com/yiisoft/yii2-elasticsearch/

    要求

    根据您使用的 Elasticsearch 版本,您需要此扩展的不同版本。

    • 对于 Elasticsearch 1.6.0 到 1.7.6,使用扩展版本 2.0.x

    • 对于 Elasticsearch 5.x 或更高版本,请使用扩展版本 2.1.x

    安装

    安装此扩展的首选方法是通过composer:

    composer require --prefer-dist yiisoft/yii2-elasticsearch:"~2.1.0"

    配置

    要使用此扩展,您必须在应用程序配置中配置 Connection 类:

    return [
         //.... 
        'components' => [
             'elasticsearch' => [
                 'class' => 'yii\elasticsearch\Connection' ,
                 'nodes' => [
                    [ 'http_address' => '127.0.0.1:9200' ],
                     // 如果你有集群,配置更多主机
                ],
                'dslVersion' => 7 , // 默认为 5
            ],
        ]
    ];

    Yii2-elasticsearch安装完毕后,就是使用了。

    2、Yii2-elasticsearch的简单使用

    使用Yii2-elasticsearch需要对elasticsearch一些基本的文档内容要大体有些了解,可以进官网进行查看文档,这里就不过多介绍,直接上有关Yii2源码部分,一看就懂。

    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

    打完收工。。。。

    高并发千万级数据库系统解决方案

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

  • 相关标签:php elasticsearch yii2
  • 相关文章

    相关视频


    专题推荐