zoukankan      html  css  js  c++  java
  • Laravel 基于 Scout 配置实现 Elasticsearch


    一、安装scout
    1、安装

    composer require laravel/scout


    2、接下来,你需要将 ScoutServiceProvider 添加到你的 config/app.php 配置文件的 providers 数组中:

    LaravelScoutScoutServiceProvider::class,


    3、注册好 Scout 的服务提供者之后,你可以使用 vendor:publish Artisan 命令生成 Scout 的配置文件。这个命令会在你的 config 目录下生成 scout.php 配置文件:

    php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"

    注意:执行上述命令没反应时 直接执行 php artisan vendor:publish 然后输入数字选择

    4、使用 composer安装scout的es驱动:

    composer require tamayo/laravel-scout-elastic


    5、安装完驱动之后,修改configscout.php配合文件,将驱动修改为elasticsearch

    'driver' => env('SCOUT_DRIVER', 'elasticsearch'),


    6、并在下方添加驱动:

    'elasticsearch' => [
    //laravel_es_test是项目名,可以自定义
    'index' => env('ELASTICSEARCH_INDEX', 'laravel_es_test'),
    'hosts' => [
    env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
    ],
    ],


    二、创建command命令
    1、使用php artisan创建command命令

    php artisan make:command ESInit


    2、执行完命令后会创建appConsoleCommandESInit.php文件,修改ESInit.php

    //使用什么命令启动脚本
    protected $signature = 'es:init';
    //描述
    protected $description = 'init laravel es for post';


    3、在appConsoleKernel.php中挂载

    protected $commands = [
    AppConsoleCommandsESInit::class
    ];

    三、配置
    1、安装guzzlehttp/guzzle 扩展

    composer require guzzlehttp/guzzle


    2、修改appConsoleCommandESInit.php

    /**
    * Execute the console command.
    *
    * @return mixed
    */
    public function handle()
    {
    try{
    //创建template
    $client = new GuzzleHttpClient(); //这里的Clinet()是你vendor下的GuzzleHttp下的Client文件
    $this->createTemplate($client);
    $this->info('============create template success============');
    $this->createIndex($client);
    $this->info('============create index success============');
    }catch (Exception $e){
    ownLogs('test.log', $e->getMessage());
    }
    
    }

    /**
    * 创建模板 see https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html
    * @param Client $client
    */
    private function createTemplate($client)
    {
    $url = config('scout.elasticsearch.hosts')[0] . '/_template/template_1';
    // $client->delete($url);
    $client->put($url, [

    
    

    'json' => [
    'index_patterns' => [config('scout.elasticsearch.index').'*'],
    'settings' => [
    'number_of_shards' => 1,
    ],
    'mappings' => [
    '_source' => [
    'enabled' => true
    ],
    'properties' => [
    'mapping' => [ // 字段的处理方式
    'type' => 'keyword', // 字段类型限定为 string
    'fields' => [
    'raw' => [
    'type' => 'keyword',
    'ignore_above' => 256, // 字段是索引时忽略长度超过定义值的字段。
    ]
    ],
    ],
    ],

    
    

    ],
    ],
    ]);
    }

    
    

    /**
    * 创建索引
    * @param Client $client
    */
    private function createIndex($client)
    {
    $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
    // $client->delete($url);
    $client->put($url, [
    'json' => [
    'settings' => [
    'refresh_interval' => '5s',
    'number_of_shards' => 1, // 分片为
    'number_of_replicas' => 0, // 副本数
    ],
    ],
    ]);
    }

     

    执行命令

    php artisan es:init

     

    注意:当前版本 ES7.3
    6.0以下,6.*,7.*,很多语法差别
    官方语法地址
    https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html

    PUT _template/template_1
    {
    "index_patterns": ["te*", "bar*"],
    "settings": {
    "number_of_shards": 1
    },
    "mappings": {
    "_source": {
    "enabled": false
    },
    "properties": {
    "host_name": {
    "type": "keyword"
    },
    "created_at": {
    "type": "date",
    "format": "EEE MMM dd HH:mm:ss Z yyyy"
    }
    }
    }
    }


    四、编辑Model文件,导入数据,调用接口
    1、编辑Model文件

    <?php
    
    namespace AppModels;
    
    use LaravelScoutSearchable;
    
    class User extends Authenticatable
    {
    use Searchable;
    
    protected $table = 'users';
    
    /**
    * The attributes that are mass assignable.
    * 可以注入的数据字段
    * @var array
    */
    protected $fillable = [
    'name', 'phone','username'
    ];
    
    // 定义索引里面的类型
    public function searchableAs()
    {
    return '_doc';
    }
    // 定义有那些字段需要搜索
    public function toSearchableArray()
    {
    return [
    'username' => $this->username,
    'phone' => $this->phone,
    ];
    }
    }


    2、导入数据

    php artisan scout:import "AppModelsuser"

    注意:看起来是导入成功其实不一定,
    vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php文件中的update方法
    $this->elastic->bulk($params);

    这句代码会最终发送指令到es.但是这里没接收返回值,建议打印一下

    一次成功,一次未成功

    3、调用接口

    $q = $request->input('q');
    $res = User::search($q)->get();
    return Response::success('成功', $res);


    http://localtest/laravel_es_test/_doc/1
    laravel_es_test:索引
    _doc:类型
    1:id

  • 相关阅读:
    laravel 解决保存Emoji 表情问题
    下载微信头像下载不了
    微信公众号开发遇到simplexml_load_string 未定义
    部署php的正确姿势
    ubuntu 安装 mysql 的正确姿势
    laravel 部署 前后端分离
    nwjs 解决手指可滑动问题
    Java8新特性Optional、接口中的默认方法与静态方法
    Java设计模式百例
    一位资深程序员大牛给予Java初学者的学习路线建议
  • 原文地址:https://www.cnblogs.com/mmmzh/p/11599678.html
Copyright © 2011-2022 走看看