首页  >  文章  >  后端开发  >  Yii2-elasticsearch 怎么用啊?

Yii2-elasticsearch 怎么用啊?

PHPz
PHPz原创
2016-06-06 20:18:383914浏览

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 = [&#39;name&#39; => $postElastic[0]->name];
</code>

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

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

<code>
class Contents extends \yii\elasticsearch\ActiveRecord
{   
    public function attributes()
    {
        return [&#39;id&#39;, &#39;title&#39;, &#39;slug&#39;, &#39;created_at&#39;, &#39;text&#39;, &#39;type&#39;, &#39;status&#39;];
    }
 
}
</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 [
     //.... 
    &#39;components&#39; => [
         &#39;elasticsearch&#39; => [
             &#39;class&#39; => &#39;yii\elasticsearch\Connection&#39; ,
             &#39;nodes&#39; => [
                [ &#39;http_address&#39; => &#39;127.0.0.1:9200&#39; ],
                 // 如果你有集群,配置更多主机
            ],
            &#39;dslVersion&#39; => 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 &#39;document&#39;;//设置文档名称,不设置默认带s结尾
    }
 
    //指定文档类型
    public static function type()
    {
        return &#39;_doc&#39;;
    }
 
    //指定文档属性
    public function attributes()
    {
        return [&#39;id&#39;, &#39;title&#39;,&#39;content&#39;,&#39;status&#39;,&#39;author&#39;];
    }
 
    public static function getMapping()
    {
        return [
                    &#39;properties&#39; => [
                        &#39;id&#39;=> [&#39;type&#39; => &#39;integer&#39;],
                        &#39;title&#39;=> [&#39;type&#39; => &#39;text&#39;,&#39;analyzer&#39;=>&#39;ik_smart&#39;],
                        &#39;content&#39;=> [&#39;type&#39; => &#39;text&#39;,&#39;analyzer&#39;=>&#39;ik_smart&#39;],
                        &#39;status&#39;=> [&#39;type&#39; => &#39;integer&#39;],
                        &#39;author&#39;=> [&#39;type&#39; => &#39;text&#39;,&#39;analyzer&#39;=>&#39;ik_smart&#39;],
                    ]
               ];
    }
 
    /**
     * Create this model&#39;s index
     */
    public static function createIndex()
    {
        $db = static::getDb();
        $command = $db->createCommand();
        $command->createIndex(static::index(), [
            &#39;mappings&#39; => 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 &#39;创建成功&#39;;
            die;
        }
        echo &#39;已创建&#39;;die;
    }
 
    //搜索
    public function actionEsSearch()
    {
        $page = Yii::$app->request->get(&#39;page&#39;) ?: 1;
        $page_size = Yii::$app->request->get(&#39;pageSize&#39;) ?: 10;
        $keyword = Yii::$app->request->get(&#39;keyword&#39;) ?: &#39;&#39;;
        $offset = ($page - 1) * $page_size;
        $es = new Document();
        //此处组装query有点小坑,可以根据es文档把json转为数组,不然容易出错
        //此处的条件相当于where status in (1,2) and (title like &#39;%keyword%&#39; or content like &#39;%keyword%&#39;)
        $query = [
            &#39;bool&#39; => [
                &#39;must&#39; => [
                    [
                        &#39;terms&#39; => [
                            &#39;status&#39; => [1,2],
                        ],
                    ],
                    [
                        &#39;bool&#39; => [
                            &#39;should&#39; => [
                                [
                                    &#39;match&#39; => [
                                        &#39;title&#39; => [
                                            &#39;query&#39; => $keyword,
                                            &#39;boost&#39; => 1, //权重
                                        ],
                                    ]
                                ],
                                [
                                    &#39;match&#39; => [
                                        &#39;content&#39; => [
                                            &#39;query&#39; => $keyword,
                                            &#39;boost&#39; => 1, //权重
                                        ],
                                    ]
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ];
 
        $hightlight = [
            "pre_tags" => [&#39;<span class="text-danger">&#39;],//要高亮的颜色css的class
            "post_tags" => [&#39;</span>&#39;],
            "fields" => [
                &#39;content&#39; => new \stdClass(),
                &#39;title&#39; => new \stdClass()
            ]
        ];
        $es_data = $es::find()
            ->source([&#39;id&#39;, &#39;title&#39;, &#39;content&#39;, &#39;status&#39;,&#39;author&#39;])
            ->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 = &#39;大佬&#39;; // attributes can be set one by one
        $Document->content = &#39;大佬6666&#39;;
        $Document->status = 1;
        $Document->author = &#39;牛皮&#39;;
        $res = $Document->save();
    }
}

先执行创建index的方法:

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

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

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

最后我们执行搜索接口actionEsSearch

 打完收工。。。。

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