반응형

라라벨에서 라라벨의 ORM을 사용할 수 있도록 엘라스틱 서치를 연동해 보도록 하자. 다양한 툴이 있지만 오늘 사용할 툴은 이것이다

 

https://elasticsearch.pdphilip.com/getting-started/

 

Getting Started

Kickstart your journey with Elasticsearch integration in Laravel, leveraging the powerful search and analytics capabilities alongside the familiar Eloquent ORM.

elasticsearch.pdphilip.com

 

여기에 있는 설명대로 하면 어려울 것은 없다.

 

먼저 설치를 하자.

 

$composer require pdphilip/elasticsearch

 

설치를 한 후에 .env 파일의 맨 끝에 아래 소스를 추가한다.

 

ES_AUTH_TYPE=http
ES_HOSTS="http://localhost:9200"
ES_USERNAME=아이디
ES_PASSWORD=암호
ES_CLOUD_ID=
ES_API_ID=
ES_API_KEY=
ES_SSL_CA=
ES_INDEX_PREFIX=
# prefix will be added to all indexes created by the package with an underscore
# ex: my_app_user_logs for UserLog.php model
ES_SSL_CERT=
ES_SSL_CERT_PASSWORD=
ES_SSL_KEY=
ES_SSL_KEY_PASSWORD=
# Options
ES_OPT_ID_SORTABLE=false
ES_OPT_VERIFY_SSL=true
ES_OPT_RETRIES=
ES_OPT_META_HEADERS=true
ES_ERROR_INDEX=
ES_OPT_BYPASS_MAP_VALIDATION=false
ES_OPT_DEFAULT_LIMIT=1000

 

나는 ES_INDEX_PREFIX 이 부분은 공백으로 두었다. 

 

그리고 config 폴더안에 있는 database.php를 수정한다.

 

'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'search_path' => 'public',
            'sslmode' => 'prefer',
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            // 'encrypt' => env('DB_ENCRYPT', 'yes'),
            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
        ],

        'elasticsearch' => [
            'driver' => 'elasticsearch',
            'auth_type' => env('ES_AUTH_TYPE', 'http'), //http or cloud
            'hosts' => explode(',', env('ES_HOSTS', 'http://localhost:9200')),
            'username' => env('ES_USERNAME', ''),
            'password' => env('ES_PASSWORD', ''),
            'cloud_id' => env('ES_CLOUD_ID', ''),
            'api_id' => env('ES_API_ID', ''),
            'api_key' => env('ES_API_KEY', ''),
            'ssl_cert' => env('ES_SSL_CA', ''),
            'ssl' => [
                'cert' => env('ES_SSL_CERT', ''),
                'cert_password' => env('ES_SSL_CERT_PASSWORD', ''),
                'key' => env('ES_SSL_KEY', ''),
                'key_password' => env('ES_SSL_KEY_PASSWORD', ''),
            ],
            'index_prefix' => env('ES_INDEX_PREFIX', false),
            'options' => [
                'bypass_map_validation' => env('ES_OPT_BYPASS_MAP_VALIDATION', false),
                'logging' => env('ES_OPT_LOGGING', false),
                'ssl_verification' => env('ES_OPT_VERIFY_SSL', true),
                'retires' => env('ES_OPT_RETRIES', null),
                'meta_header' => env('ES_OPT_META_HEADERS', true),
                'default_limit' => env('ES_OPT_DEFAULT_LIMIT', 1000),
                'allow_id_sort' => env('ES_OPT_ID_SORTABLE', false),
            ],
        ],

    ],

 

elasticsearch 부분을 반드시 connections 안에 넣어줘야 한다.

 

그리고 config안의 app.php도 수정한다.

'providers' => ServiceProvider::defaultProviders()->merge([
        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        PDPhilip\Elasticsearch\ElasticServiceProvider::class,
    ])->toArray(),

 

providers안에 elasticsearch부분을 추가해준다.

 

이렇게하면 준비는 끝났다.

 

config를 바꿨으니 캐시도 한번 날려준다.

 

$php artisan config:cache

 

자 이제 소스에서 ORM을 쓰기 위한 준비를 해준다. 먼저 모델을 만들어준다.

 

app/Models/Chukppa.php

 

<?php

namespace App\Models;

use PDPhilip\Elasticsearch\Eloquent\Model;

class Chukppa extends Model
{
    protected $connection = 'elasticsearch';
    protected $table = 'chukppa';
}

?>

 

모델명과 table명을 확인하자. table명이 index명이다.

 

이제 이 모델을 이용해서 콘트롤러에서 값을 출력해보자.

 

public function elatest(){
        $rs = Chukppa::where("multi","soccer")->latest('site_reg_date')->paginate(20);
        foreach($rs as $r){
            echo "제목:".$r->subject."<br>";
        }
    }

 

이런식으로 사용한다. 마치 mysql의 테이블을 불러오는듯이 자연스럽다.

 

다음엔 등록하고 수정하는것들을 해보자.

반응형

+ Recent posts