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

本文详细介绍了如何使用Elasticsearch进行环境搭建,并通过PHP调用其接口。进一步,文章深入探讨了如何利用Laravel队列处理从MySQL同步到Elasticsearch的数据流程,包括代码实现和具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
验证数据是否同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值