Laravel 下 Elasticsearch 使用

Shine-x發表於2019-03-11

安裝scout

composer require laravel/scout
在config/app.php 的 providers 陣列中新增
Laravel\Scout\ScoutServiceProvider::class
執行命令
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider

安裝laravel-scout-elastic

composer安裝
composer require tamayo/laravel-scout-elastic
在config/app.php 的 providers 陣列中新增
ScoutEngines\Elasticsearch\ElasticsearchProvider::class
修改scout.php檔案:

  'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
     在最後新增
            //配置elasticsearch引擎
        'elasticsearch' => [
            'index' => env('ELASTICSEARCH_INDEX', 'laravel'),//laravel就是索引的名字,可以隨便起
            'hosts' => [
                env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
            ],
        ]

可能composer時可能會報錯,是版本太高,實現降權(降低版本就好)【 composer require laravel/scout ^5.0.3】

建立命令

執行命令 php artisan make:command 命令的名
php artisan make:command ESinit
會在 app\Console\Commands\目錄下建立 ESinit.php
class ESinit extends Command

{
    /**
     * The name and signature of the console command.
     * 這是命令的名字
     * @var string
     */
    //執行命令的名稱
    protected $signature = 'es:init';
/**
     * The console command description.
     * 命令的描述
     * @var string
     */
    //protected $description = 'Command description';
    protected $description = 'init laravel es for post';

    /**
     * Create a new command instance.
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 在這裡寫要寫的東西
     * Execute the console command.
     * @return mixed
     */
    public function handle()
    {
        //coding,待會兒我們要在這裡寫程式碼
    }
}

在 app\Console\Kernel.php 裡寫

    protected $commands = [
            \App\Console\Commands\ESinit::class
        ];
composer require guzzlehttp/guzzle 

安裝guzzlehttp/guzzle成功後,在ESinit.php裡的handle()方法裡寫

//建立template
$client = new Client(); //這裡的Clinet()是你vendor下的GuzzleHttp下的Client檔案
$url = config('scout.elasticsearch.hosts')[0].'/inssa';   //這裡寫logstash配置中index引數
$client->delete($url);//確定沒有這個url

/*
 * 這個模板作用於我要做用的索引
 * */
$param = [
    'json'=>[
        /*
         * 這句是取在scout.php(scout是驅動)裡我們配置好elasticsearch引擎的
         * index項。
         * PS:其實都是取陣列項,scout本身就是return一個陣列,
         * scout.elasticsearch.index就是取
         * scout[elasticsearch][index]
         * */
        'template'=>config('scout.elasticsearch.index'),
        'mappings'=>[
            '_default_'=>[
                'dynamic_templates'=>[
                    [
                        'string'=>[
                            'match_mapping_type'=>'string',//傳進來的是string
                            'mapping'=>[
                                'type'=>'text',//把傳進來的string按text(文字)處理
                                'analyzer'=>'ik_smart',//用ik_smart進行解析(ik是專門解析中的外掛)
                                'fields'=>[
                                    'keyword'=>[
                                        'type'=>'keyword'
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ],
    ],
];
$client->put($url,$param);

$this->info('============create template success============');

//建立index
$url = config('scout.elasticsearch.hosts')[0].'/'.config('scout.elasticsearch.index');
//$client->delete($url);

$param = [
    'json'=>[
        'settings'=>[
            'refresh_interval'=>'5s',
            'number_of_shards'=>1,
            'number_of_replicas'=>0,
        ],

        'mappings'=>[
            '_default_'=>[
                '_all'=>[
                    'enabled'=>false
                ]
            ]
        ]
    ]
];

$client->put($url,$param);
$this->info('============create index success============');

首先得啟動Es

執行 php artisan es:init命令,出現下邊的資訊就說明執行成功了

    ============create template success============ 
    ============create index success==============

修改你要搜尋的model,以Admin為eg:

引用名稱空間

use Laravel\Scout\Searchable;

類中引用Searchable

use Searchable;

重寫searchableAs()方法 toSearchableArray() 方法

 public function searchableAs() {
        return 'post';
    }
    public function toSearchableArray() {
        return [
            'title'=>$this->title,
            'content'=>$this->content
        ];
    }

控制器呼叫方法,展示資料

  $posts  = \App\Model\Admin::search('')->get();

sdfsdf

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章