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

(الستیک سرچ) 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&quotOpenJDK 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<?phpreturn 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.phpRoute::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 resultreturn($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}}]}}