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

打完收工。。。。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号