docker搭建ElasticSearch 環境配合mysql搭建搜索引擎

ElasticSearch 壞境搭建

拉取鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2
運行容器
docker run -d --name es -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:6.3.2
docker ps 查看ES服務是否啓動
測試ES curl 192.168.254.128:9200

在這裏插入圖片描述

使用php調用ES接口

Class Test{
	public function HttpResquset($method = 'GET', $data='', $action='', $header = array(), $token = '',  $timeout = 60) {
        $headers[] = "Content-type: application/json";
        $url = "http://192.168.254.128:9200/";
        $url = $url . $action;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        switch ($method) {
            case 'GET':
                break;
            case 'POST':
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                break;
            case 'PUT':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                break;
            case 'DELETE':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
                break;
        }
        $result = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        $return = json_decode($result, TRUE);
        return $return;
    }
    public function testes()
    {
    	$data = ” {"class":"軟件工程1999","name":"zhangsan1999","age":1999}";
    	$action = "school/js/1"
    	$data = $this->HttpResquset($method = "GET", $data, $action);
        var_dump($data);
    }
}

測試 curl http://192.168.254.128:9200/school/js/1

同步mysql數據和ES數據

設計思路
使用laravel隊列處理ES數據
數據存入mysql數據庫之後,加入隊列數據存入ES中
代碼實現如下

vim /app/Http/Controller.php

<?php
namespace App\Http\Controllers;
//新加
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Models\Test;//測試model類
use App;
use App\Jobs\ProcessPodcast;
use App\Jobs\Post;

class Controller extends BaseController
{
	/**
     * 測試隊列
     */
    public function post($insertData)
    {
        $post = new Post;
        foreach ($insertData as $key=>$item) {
            $post->name = $item['name'];
            $post->age = $item['age'];
            $post->class = $item['class'];
            $post->url = 'schools/js/' . $item['id'];
            $post->id = $item['id'];
            $this->dispatch(new ProcessPodcast($post)); // 隊列
        }
    }

    //數據寫入mysql 通過隊列加入es中
    public function testPutES(Test $Test)
    {
        //寫入數據庫
        $insertData = [];
        for ($i = 1; $i < 100; $i++ ) {
            $data['class'] = '軟件工程' . $i;
            $data['name'] = 'zhangsan' . $i;
            $data['age'] = $i;
            if(isset($data['id'])){
                unset($data['id']);
            }
            $insertId = $Test->insertData($data);
            if(!empty($insertId)){
                $data['id'] = $insertId;
            }
            $insertData[] = $data;
        }
        //寫入隊列
        $this->post($insertData);
    }
}

vim /app/Models/Test.php

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use DB;
use Predis;

    /**
     *處理數據 數據寫入數據庫
     * $result 插入數據id
     */
    public function insertData($data)
    {
        $insertId = DB::table('users')->insertGetId($data);
        if(!empty($insertId)){
            return $insertId;
        }
    }

}

處理任務類vim /app/Jobs/Post.php

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Routing\Controller as BaseController;

class Post extends BaseController
{
    /**
     * 處理隊列任務
     */
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $name;
    public $age;
    public $class;
    public $url;
    public $id;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {

    }

    /**處理隊列數據
     * @return string
     */
    public function getData()
    {
//        $result = $this->name . $this->age;
        $dataTmp['class'] = $this->class;
        $dataTmp['name'] = $this->name;
        $dataTmp['age'] = $this->age;
        $dataTmp['id'] = $this->id;
        $data = json_encode($dataTmp, JSON_UNESCAPED_UNICODE);
        $action = $this->url;
        var_dump($data, $action);
        $res = $this->HttpResquset($method = "PUT",$data, $action);
        return $res;
    }
}

vim /app/Jobs/ProcessPodcast.php

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

//use App\Jobs\Post;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $post;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        $this->post = $post;
    }

    /**
     * Execute the job. //處理任務
     *
     * @return void
     */
    public function handle()
    {
        var_dump($this->post->getData());
    }
}

運行隊列,php artisan queue:work
驗證數據是否同步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章