课程推荐→:《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
打完收工。。。。
