نحوه متصل کردن لاراول به ElasticSearch


در مورد نحوه اتصال لاراوال به الاستیک سرچ داخل گوگل که سرچ کنید مطالب زیادی برای دیدن میاد.

اما متاسفانه یا ناقص هست یا به خاطر وجود library های زیادی که برای این کار توسعه داده شده که البته تعداد زیادیشون هم خیلی وقته به روز نشدن مثل من شاید دچار سردرگرمی بشید

تقریبا بعد از یک هفته سرچ و جستجو بالاخره این library که بر روی Scout لاراوال توسعه داده شده است انتخاب کردم که تقریبا به روز ترین آن هاست و کار برای اتصال نسبتا کمی راحت می کنه و با ابزارهایی که میده میتونه کمک کنه استفاده راحت تری از سیستم داشته باشد .


ابتدا برای دوستانی که اطلاعات دقیقی از الاستیک ندارن (من خودمم زیاد اطلاعات خوبی ندارم در این زمینه :) ) می توانند برای آشنایی بیشتر مطلب زیر مطالعه کنند

https://virgool.io/@a.bidva/why-elasticsearch-pbf2mtv9xiv1

خیلی ساده داخل این پست می توانید در این مورد مطالعه کنید و البته کاربردی بودنش بتونید متوجه بشید .


برای راحتی راه اندازی یک سرور تست راحت می تونید از Image Docker الاستیک سرچ استفاده کنید که کار خیلی راحت می کند .

بعد از نصب و راه اندازی داکر با دستور زیر می توانید به راحتی یک نسخه آماده استفاده از elasticsearch داشته باشید که کلیه تست هاتون بر روی آن سرور انجام بدید .

کافیه بعد از نصب داکر دستور زیر را در خط فرمان داکر وارد کنید .

docker run -d --name elstictest -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.4.2

بعد از اجرای دستور داکر ابتدا Image الاستیک سرچ که برای داکر ایجاد شده است (نسخه 7.4.2) دانلود می کنه و یک بار اجرا می کند و در بک گراند قرار میگیرد

یه توضیح کوچکی در مورد این دستور و پارامترهاش بدم

---name elastictest

در واقع بعد از راه اندازی داکر یک نام برای کانتاینتر ایجاد شده در نظر میگیرد که اسم آن را elastictest ما قرار دادیم در صورتی که این قسمت قرار داده نشده داکر به صورت خودکار یک نام به صورت رندم به آن اختصاص می دهد

 -e "discovery.type=single-node" 

در قسمت بالا -e برای مقدار دادن به متغیرهایی که داخل Image Docker الاستیک استفاده شده است ، استفاده می شود .

در اینجا متغیر discovery.type مقدار دهی شده است به عنوان single-node به منظور این که تنها یک نود الاستیک ما دارم که در سایت خود الاستیک در این باره توضیحات کامل داده شده است فقط به این نکته اشاره کنم که سیستم الاستیک سرچ قابلیت کارکرد به صورت چندین نود همزمان را دارا می باشد .

-d

برای این منظور است که بعد از اجرا در بک گراند قرار بگیرد در صورت نزاشتن این دستور یک بار سرور اجرا شده و بعد دستور Exit اجرا می شود و Container متوقف می شود.


تا این مرحله با سرور الاستیک آماده کردیم و در ادامه کار بایستی به سراغ لاراول برویم و مراحل تنظیم برای اتصال به آن را انجام می دهیم .


تنظیمات لاراول برای اتصال

برای این کار باید چند کار انجام دهیم که به یک توضیح خواهم داد .

فقط توجه داشته باشید برای اتصال لاراول من از Package زیر استفاده کردم .

http://github.com/babenkoivan/scout-elasticsearch-driver



تقریبا تا این تاریخ به روز ترین package که با لاراولا 6 و همین طور الاستیک سرچ 7.4.2 کار کند این پکیج است .


مراحل نصب

1- ابتدا بایستی Scout را نصب نماییم توسط دستور زیر این کار را انجام می دهیم

https://laravel.com/docs/6.x/scout

بعد از نصب scout به این صفحه که مربوطه به درایور scout به elasticsearch مراجعه کنید و مراحل نصب طبق دستور العمل انجام دهید

https://github.com/babenkoivan/scout-elasticsearch-driver#installation

تا اینجای کار مراحل در داکومنت scout و همین طور driver elastic برای اسکات است که به راحتی از روی داکومنت می توان انجام داد.

بعد از نصب هم بایستی مراحل اتصال لاراول توسط فایل های کانفیگی که توضیح داده شده است انجام شود.

در مراحل بعدی باید تنظیمات داخل لاراوال تنظیم شود

2- بایستی فایل های scout و scout_elastic را برای استفاده تنظیم نماییم و این فایل در مسیر config قرار گرفته است و اگر مسیر نصب و مراحل را درست انجام داده باشید این دو فایل ایجاد شده است .

//config/scout.php
'driver' => env('SCOUT_DRIVER', 'elastic'),

در فایل مربوطه بایستی SCOUT_DRIVER به elastic تغییر دهید . در ابتدای کار نیازی به تغییرات در بقیه بخش ها نخواهد بود .

در فایل دیگر بایستی سرور را مشخص نمایید

//config/scout_elastic.php
'client' => [
    'hosts' => [
        env('SCOUT_ELASTIC_HOST', 'elastic:9200'), //elastic = localhost or ip server
    ],
],

قرار دهید . تا به اینجا ارتباط بین سرور و درایور scout برقرار شده است.

در مرحله بعدی برای انجام اتصال هر بانک اطلاعاتی بایستی به این صورت عمل شود

3- اگر به طور مثال مدل ما Post باشید یک فایل با دستور زیر ایجاد می نماییم .

فایل مربوطه در فولدر App ایجاد می گردد

php artisan make:index-configurator PostIndexConfigurator

محتویات فایل به صورت زیر می باشد :

<?php

namespace App;

use ScoutElastic\IndexConfigurator;

class PostIndexConfigurator extends IndexConfigurator
{
    // It's not obligatory to determine name. By default it'll be a snaked class name without `IndexConfigurator` part.
    protected $name = 'index_post';  
    
    // You can specify any settings you want, for example, analyzers. 
    protected $settings = [
        'analysis' => [
            'analyzer' => [
                'es_std' => [
                    'type' => 'standard',
                    'stopwords' => '_persian_'
                ]
            ]    
        ]
    ];
}

فایل مربوطه برای ساخت ایندکس مورد نظر بر روی سرور الاستیک استفاده می شود

برای ارسال تنظیمات انجام شده به سرور با دستور زیر اقدام می شود

php artisan elastic:create-index App\\PostIndexConfigurator

در صورتی که بدون مشکل اجرا شود پیغا Success دریافت خواهید کرد.

4- در مرحله بعد بایستی بانک اطلاعاتی به elastic و همین طور Index که ساخته شده است متصل شود.

با دستور زیر می توایند یک مدل با قابلیت اتصال به Elastic ایجاد نمایید.

php artisan make:searchable-model Post--index-configurator=PostIndexConfigurator

بعد از اجرای دستور بالا مدل Post ایجاد می شود .

<?php

namespace App;

use ScoutElastic\Searchable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Searchable;

    protected $indexConfigurator = PostIndexConfigurator::class;

    protected $searchRules = [
        //
    ];

    // Here you can specify a mapping for model fields
    protected $mapping = [
        'properties' => [
            'title' => [
                'type' => 'text',
                // Also you can configure multi-fields, more details you can find here https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html
                'fields' => [
                    'raw' => [
                        'type' => 'keyword',
                    ]
                ]
            ],
        ]
    ];
}

با کار بالا اتصال انجام شده است توجه داشته باشید title یکی از فیلد ها می باشد که برای هر فیلد می توان به همین صورت تنظیمات انجام داد . تنظیمات مربوط به الاستیک نیز بایستی به داکومنت های الاستیک مراجعه کنید

برای بارگزاری اطلاعات جدول در الاستیک با دستور زیر می توانید اقدام نمایید

php artisan scout:import "App\Post"

در مرحله آخر با اجرای

elastic:9200/_cat/count/index_post

می توانید تعداد رکوردهای ثبت شده برای این ایندکس مشاهده نمایید.


به صورت زیر هم می توانید اطلاعات مورد نیاز خود از سرور الاستیک دریافت نمایید.

App\MyModel::search('title')
    // specify columns to select
    ->select(['title', 'price'])
    // sort
    ->orderBy('title', 'asc')
    // collapse by field
    ->collapse('brand')
    // set offset
    ->from(0)
    // set limit
    ->take(10)
    // get results
    ->get();

توجه داشته باشید من سعی کردم در این آموزش مراحل اتصال یک سیستم لاراول از راه اندازی الاستیک تا ایجاد ایندکس و ورود داده ها به سرور الاستیک را انجام دهم.

امیدوارم کار آمد باشد.