حانیه آتش پنجه
حانیه آتش پنجه
خواندن ۴ دقیقه·۵ سال پیش

پیاده سازی الستیک سرچ در لاراول

(الستیک سرچ) Elasticsearch چیست؟

الستیک سرچ یک موتور جستجو متن باز و قابل توزیع است که با رابط کاربری وب (HTTP) و الگوی استاندارد JSON برای انتقال داده ها کار می کند . و به وسیله جاوا توسعه داده شده است، همچنین به صورت گسترده و دقیق از طریق API قابل دسترسی است. این تکنولوژی می تواند جست و جوی بسیار سریع و قدرتمندی را در میان داده ها انجام دهد.

این تکنولوژی برای جستجو، امکان ترکیب و استفاده از انواع مختلف داده های ساخت یافته، غیر ساخت یافته و... را دارد . وهمه چیز را در داخل خودش index می کند و در کمترین زمان ممکن به درخواست ها پاسخ می دهد، قابلیت اجرا بر روی صدها سرور با داده های بسیار زیاد را دارد. همچنین پایداری و انعطاف پذیری بالایی دارد و در هنگام بروز مشکلات سخت افزاری یا شبکه، خرابی را تشخیص می دهد و کلاستر داده ی خودش را حفظ می کند تا قابل استفاده باشد. برای مسائل امنیتی نیز امکان تعریف نام کاربری و رمز عبور و همچنین اعمال مجوز و ایجاد نقش در کلاستر وجود دارد.

چرا باید از الستیک سرچ استفاده کنیم؟

الستیک‌سرچ در واقع یک نوع پایگاه داده یا Database است که مهم‌ترین کاربردش جستجوی متن است. درست است که بانک‌های داده‌ای مثل MySql و یا MongoDB امکان ایندکس کردن برای جتسجوی Fulltext را می دهند اما سرعتشان در مقایسه با ElasticSearch بسیار پایین است مخصوصا وقتی که تعداد داده‌ها از مرحله ۱۰ میلیون رکورد بیشتر می شود و یا حجم متن‌ها خیلی طولانی است.

علت اصلی استفاده از الستیک سرچ جست و جوی سریع و دقیق در مقابل حجم زیادی از داده ها است (در مقایسه با یک سخت افزار مشابه، کوئری هایی که در 10 ثانیه به شما نتیجه را برمی گردانند، Elasticsearch در زمانی کمتر از 10 میلی ثانیه به شما جواب خواهد داد.)

الستیک سرچ چطور کار می کند؟

با استفاده از API و موتور جمع آوری داده یا ابزارهای تفسیر لاگ مثل logstash و Amazon kinesis Firehose می تونید اطلاعات را در قالب فایل های JSON به ElasticSearch ارسال کنید.

الستیک سرچ بلافاصله فایل اصلی را ذخیره می کند و به ایندکس کلاستر فایل، یک کلید قابل جستجو اضافه می کند. حالا می توانید فایل را با استفاده از API ای که برای Elasticsearchطراحی شده است ، جستجو و بازیابی کنید.

کیبانا (kibana) چیست؟

یک ابزار تصویرسازی open source است که به همراه Elasticsearch اطلاعات شما را تصویرسازی کرده و داشبورد های تعاملی می سازد.


فوائدElasticSearchچیست؟

صرف زمان کم از شروع کار تا رسیدن به نتیجه

کارایی بالا

عملیات تقریبا Real Time

توسعه آسان برنامه

پرکاربردترین موارد استفاده از Elasticsearch

لاگ گیری و تحلیل لاگ

جمع آوری و ترکیب داده های عمومی

جستجوی Fulltext

معیارها و داده های برنامه

داده های تصویر سازی

نحوه استفاده

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

با دستورات

$ sudo apt update
$ sudo apt install apt-transport-https


پکیج های خود را اپدیت کرده و با دستور دوم پکیج مربوط به دسترسی به پکیج های موجود بر بستر https

را خواهید داشت .

$ sudo apt install openjdk-8-jdk

با این دستور (OpenJDK 8) را برروی سیستم خود نصب میکنید .

$ java -version

این دستور درستی نصب جاوا برروی سیستم و همچنین نسخه ی نصب شده را به شما نشان خواهد داد .

خروجی :
openjdk version &quot1.8.0_222&quot
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~19.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

با نوشتن دستور در ترمینال

$ echo $JAVA_HOME

مطمئن شوید که این متغیر به درستی ست شده است .

خروجی :

/usr/lib/jvm/java-11-openjdk-amd64

حال نوبت به نصب الستیک برروی سیستم رسیده است :

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

دستور بالا خروجی ok را برمیگرداند که به معنی این است که کلید به درستی بارگذاری شده است و پکیج مورد قبول قرار گرفته است .

حال با دستور زیر مخزن الستیک را به سیستم اضافه میکنیم:

$ sudo sh -c 'echo &quotdeb https://artifacts.elastic.co/packages/7.x/apt stable main&quot > /etc/apt/sources.list.d/elastic-7.x.list'

حال پکیج ها را اپدیت و الستیک را نصب میکنیم :

$ sudo apt update
$ sudo apt install elasticsearch

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

$ sudo systemctl enable elasticsearch.service
$ sudo systemctl start elasticsearch.service

اکنون الستیک سرچ قابل استفاده است .

$ curl -X GET &quothttp://localhost:9200/?pretty&quot

خروجی الستیک به شما به شکل زیر خواهد بود:

{
&quotname&quot : &quotmyNode1&quot,
&quotcluster_name&quot : &quotmyCluster1&quot,
&quotcluster_uuid&quot : &quotYLBEZHdqQ2W_gMiDUJXJyw&quot,
&quotversion&quot : {
&quotnumber&quot : &quot7.3.0&quot,
&quotbuild_flavor&quot : &quotdefault&quot,
&quotbuild_type&quot : &quotdeb&quot,
&quotbuild_hash&quot : &quotde777fa&quot,
&quotbuild_date&quot : &quot2019-07-24T18:30:11.767338Z&quot,
&quotbuild_snapshot&quot : false,
&quotlucene_version&quot : &quot8.1.0&quot,
&quotminimum_wire_compatibility_version&quot : &quot6.8.0&quot,
&quotminimum_index_compatibility_version&quot : &quot6.0.0-beta1&quot
},
{ &quottagline&quot : &quotYou Know, for Search&quot

منابع :

نصب الستیک سرچ روی اوبونتو(منبع اول)

نصب الستیک سرچ روی اوبونتو(منبع دوم)

استفاده از الستیک سرچ در لاراول

بهترین پکیجی که برای الستیک وجود دارد پکیج Elasticquent هست .

علت استفاده از این پکیج این است که هم بتوانیم برای سرچ در دیتای mysql خود از الستیک استفاده کنیم و هم برای خود دیتابیس الستیک از آن استفاده کنیم . مثلا لاگ های سیستم را در دیتابیس elasticsearch و رکورد ها را در دیتابیس mysql ذخیره کنیم .

در فایل composer.json در انتهای ارایه ی require

&quotelasticquent/elasticquent&quot: &quotdev-master&quot

را اضافه میکنیم و بعد از آن با اجرای دستور composer update این پکیج را بر روی پروژه ی خود داریم .

حال در هر جایی از پروژه که احتیاج به استفاده از این پکیج داریم کافی است این پکیج را صدا بزنیم .

use Elasticquent\ElasticquentTrait;

به طور پیش فرض الستیک به localhost:9200 متصل است .و از default برای ایندکس استفاده میکند . که می توانیم این پیش فرض ها را عوض کنیم .

دستور زیر فایل elasticquent.php را در مسیر /app/config/elasticquent.php میسازد.

$ php artisan vendor:publish --provider=&quotElasticquent\ElasticquentServiceProvider&quot

فایل elasticquent.php

<?php
return array(
/*
|--------------------------------------------------------------------------
| Custom Elasticsearch Client Configuration
|--------------------------------------------------------------------------
|
| This array will be passed to the Elasticsearch client.
| See configuration options here:
|
| http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/_configuration.html
*/
'config' => [
'hosts' => ['localhost:9200'],
'retries' => 1,
],
/*
|--------------------------------------------------------------------------
| Default Index Name
|--------------------------------------------------------------------------
|
| This is the index name that Elastiquent will use for all
| Elastiquent models.
*/
'default_index' => 'my_custom_index_name',
);

مثالی از استفاده ی الستیک در لاراول :

در فایل route.php

Route::get('/enter/{age}/{name}',function($age,$name){
//connect with the client
$client = Elasticsearch\ClientBuilder::create()->build();
$params = array();
$params['body'] = array(
'name' => $name, //preparing structred data
'age' => $age
);
$params['index'] = 'BeyBlade';
$params['type'] = 'BeyBlade_Owner';
//using Index() function to inject the data
$result = $client->index($params);
var_dump($result);
});

در این مثال میتوانیم با وارد کردن ادرس هایی در براوزر مثل:

<your_laravel_app_url>/enter/23/ali
<your_laravel_app_url>/enter/22/reza
<your_laravel_app_url>/enter/21/amir

مدل جدیدی از الستیک ساخته میشود و دیتای وارد شده در ارایه ی مورد نظر ذخیره میشوند .

و خروجی به شکل زیر خواهد بود :

array (size=5)
'_index' => string 'BeyBlade' (length=7)
'_type' => string 'BeyBlade_Owner' (length=15)
'_id' => string 'AVQujnHkGBg9fUGgzM5T' (length=20)
'_version' => int 1
'created' => boolean true

حال مثلا برای جست و جو بر حسب سن روت زیر را تعریف میکنیم :

Route::get('find/{age}',function($age){
//connect to the client
$client = Elasticsearch\ClientBuilder::create()->build();
// Preparing Indexed Data
$params['index'] = 'BeyBlade';
$params['type'] = 'BeyBlade_Owner';
//Find data in which age matches given input
$params['body']['query']['match']['age'] = $age;
//Using Search function
$result = $client->search($params);
//Printing out result
return($result);
});

که مثلا وقتی روت your_laravel_app_url/find/23 وارد میشود خروجی به شکل زیر خواهد بود :

{&quottook&quot:3,&quottimed_out&quot:false,&quot_shards&quot:
{&quottotal&quot:5,&quotsuccessful&quot:5,&quotfailed&quot:0},
&quothits&quot:
{&quottotal&quot:1,&quotmax_score&quot:0.30685282,
&quothits&quot:[{&quot_index&quot:&quotBeyBlade&quot,
&quot_type&quot:&quotBeyBlade_Owner&quot,
&quot_id&quot:&quotAVQtylPFGBg9fUGgzM5M&quot,
&quot_score&quot:0.30685282,
&quot_source&quot:{&quotname&quot:&quotali&quot,&quotage&quot:&quot23&quot,&quotbadges&quot:8}}]}}
الستیک سرچelasticsearchelastickibana
شاید از این پست‌ها خوشتان بیاید