目录
回复内容:
首页 后端开发 php教程 Yii2-elasticsearch 怎么用啊?

Yii2-elasticsearch 怎么用啊?

Jun 06, 2016 pm 08:18 PM
php

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 使用数据库 CakePHP 使用数据库 Sep 10, 2024 pm 05:25 PM

在 CakePHP 中使用数据库非常容易。本章我们将了解CRUD(创建、读取、更新、删除)操作。

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

CakePHP 日志记录 CakePHP 日志记录 Sep 10, 2024 pm 05:26 PM

登录 CakePHP 是一项非常简单的任务。您只需使用一项功能即可。您可以记录任何后台进程(如 cronjob)的错误、异常、用户活动、用户采取的操作。在 CakePHP 中记录数据很容易。提供了 log() 函数

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

See all articles