การใช้ Laravel Scout เพื่อเปิดใช้งานการค้นหาข้อความแบบเต็ม

เผยแพร่แล้ว: 2023-05-08

Laravel framework ได้กลายเป็นแหล่งข้อมูลสำหรับนักพัฒนาที่สร้างบริการเว็บ

ในฐานะเครื่องมือโอเพ่นซอร์ส Laravel นำเสนอฟังก์ชันการทำงานนอกกรอบมากมายที่ช่วยให้นักพัฒนาสามารถสร้างแอปพลิเคชันที่แข็งแกร่งและใช้งานได้จริง

หนึ่งในข้อเสนอ ได้แก่ Laravel Scout ซึ่งเป็นไลบรารีสำหรับจัดการดัชนีการค้นหาสำหรับแอปพลิเคชันของคุณ ความยืดหยุ่นช่วยให้นักพัฒนาสามารถปรับแต่งการกำหนดค่าและเลือกจากไดรเวอร์ Algolia, Meilisearch, MySQL หรือ Postgres เพื่อจัดเก็บดัชนี

ที่นี่ เราจะสำรวจเครื่องมือนี้ในเชิงลึก โดยสอนวิธีเพิ่มการสนับสนุนการค้นหาข้อความแบบเต็มให้กับแอปพลิเคชัน Laravel ผ่านไดรเวอร์ คุณจะจำลองแอปพลิเคชัน Laravel สาธิตสำหรับจัดเก็บชื่อรถไฟจำลอง จากนั้นใช้ Laravel Scout เพื่อเพิ่มการค้นหาไปยังแอปพลิเคชัน

ข้อกำหนดเบื้องต้น

ในการติดตามคุณควรมี:

  • คอมไพเลอร์ PHP ที่ติดตั้งบนคอมพิวเตอร์ของคุณ บทช่วยสอนนี้ใช้ PHP เวอร์ชัน 8.1
  • เครื่องมือ Docker หรือ Docker Desktop ที่ติดตั้งบนคอมพิวเตอร์ของคุณ
  • บัญชีคลาวด์ Algolia ซึ่งคุณสามารถสร้างได้ฟรี
ต้องการทำให้แอปของคุณเป็นมิตรกับผู้ใช้มากขึ้นหรือไม่ ลองเพิ่มการสนับสนุนการค้นหาข้อความแบบเต็ม! นี่คือวิธีการของ Laravel Scout ️ คลิกเพื่อทวีต

วิธีติดตั้ง Scout ในโครงการ Laravel

ในการใช้ Scout ก่อนอื่นคุณต้องสร้างแอปพลิเคชัน Laravel ที่คุณต้องการเพิ่มฟังก์ชันการค้นหา สคริปต์ Laravel-Scout Bash มีคำสั่งเพื่อสร้างแอปพลิเคชัน Laravel ภายในคอนเทนเนอร์ Docker การใช้ Docker หมายความว่าคุณไม่จำเป็นต้องติดตั้งซอฟต์แวร์สนับสนุนเพิ่มเติม เช่น ฐานข้อมูล MySQL

สคริปต์ Laravel-scout ใช้ภาษาสคริปต์ Bash ดังนั้นคุณต้องดำเนินการภายในสภาพแวดล้อม Linux หากคุณใช้ Windows ตรวจสอบให้แน่ใจว่าคุณกำหนดค่า Windows Subsystem สำหรับ Linux (WSL)

หากใช้ WSL ให้ดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัลเพื่อตั้งค่าการกระจาย Linux ที่คุณต้องการ

 wsl -s ubuntu

จากนั้น นำทางไปยังตำแหน่งบนคอมพิวเตอร์ของคุณที่คุณต้องการวางโครงการ สคริปต์ Laravel-Scout จะสร้างไดเรกทอรีโครงการที่นี่ ในตัวอย่างด้านล่าง สคริปต์ Laravel-Scout จะสร้างไดเร็กทอรีภายใน ไดเร็กทอรีเดสก์ ท็อป

 cd /desktop

รันคำสั่งด้านล่างเพื่อรันสคริปต์ Laravel-Scout มันจะนั่งร้านโปรแกรม Dockerized ด้วยรหัสสำเร็จรูปที่จำเป็น

 curl -s https://laravel.build/laravel-scout-app | bash

หลังจากการดำเนินการ ให้เปลี่ยนไดเร็กทอรีของคุณโดยใช้ cd laravel-scout-app จากนั้นเรียกใช้คำสั่ง sail-up ภายในโฟลเดอร์โครงการเพื่อเริ่มคอนเทนเนอร์ Docker สำหรับแอปพลิเคชันของคุณ

หมายเหตุ: ในลีนุกซ์หลายรุ่น คุณอาจต้องเรียกใช้คำสั่งด้านล่างด้วยคำสั่ง sudo เพื่อเริ่มสิทธิ์การยกระดับ

 ./vendor/bin/sail up

คุณอาจพบข้อผิดพลาด:

เกิดข้อผิดพลาดที่ระบุว่ามีการจัดสรรพอร์ต
เกิดข้อผิดพลาดที่ระบุว่ามีการจัดสรรพอร์ต

ในการแก้ปัญหานี้ ให้ใช้ตัวแปร APP_PORT เพื่อระบุพอร์ตภายในคำสั่ง sail up :

 APP_PORT=3001 ./vendor/bin/sail up

จากนั้น ดำเนินการคำสั่งด้านล่างเพื่อเรียกใช้แอปพลิเคชันผ่าน Artisan บนเซิร์ฟเวอร์ PHP

 php artisan serve
ให้บริการแอปพลิเคชัน Laravel ด้วย Artisan
ให้บริการแอปพลิเคชัน Laravel ด้วย Artisan

จากเว็บเบราว์เซอร์ของคุณ ไปที่แอปพลิเคชันที่รันอยู่ที่ http://127.0.0.1:8000 แอปพลิเคชันจะแสดงหน้าต้อนรับของ Laravel ที่เส้นทางเริ่มต้น

หน้าต้อนรับของแอปพลิเคชัน Laravel
หน้าต้อนรับของแอปพลิเคชัน Laravel

วิธีเพิ่ม Laravel Scout ลงในแอปพลิเคชัน

ในเทอร์มินัลของคุณ ให้ป้อนคำสั่งเพื่อเปิดใช้งานตัวจัดการแพ็คเกจ Composer PHP เพื่อเพิ่ม Laravel Scout ให้กับโปรเจ็กต์

 composer require laravel/scout

ถัดไป เผยแพร่ไฟล์คอนฟิกูเรชันของ Scout โดยใช้คำสั่ง vendor:publish คำสั่งจะเผยแพร่ไฟล์คอนฟิกูเรชัน scout.php ไปยังไดเร็กทอรี การกำหนดค่า ของแอปพลิเคชันของคุณ

 php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

ตอนนี้ แก้ไขไฟล์สำเร็จรูป .env ให้มีค่าบูลีน SCOUT_QUEUE

ค่า SCOUT_QUEUE จะช่วยให้หน่วยสอดแนมสามารถดำเนินการตามคิวได้ โดยให้เวลาตอบสนองที่ดีกว่า หากไม่มีสิ่งนี้ นักขับลูกเสืออย่าง Meilisearch จะไม่แสดงสถิติใหม่ในทันที

 SCOUT_QUEUE=true

นอกจากนี้ แก้ไขตัวแปร DB_HOST ในไฟล์ .env ให้ชี้ไปที่ localhost ของคุณเพื่อใช้ฐานข้อมูล MySQL ภายในคอนเทนเนอร์ Docker

 DB_HOST=127.0.0.1

วิธีทำเครื่องหมายโมเดลและกำหนดค่าดัชนี

Scout ไม่เปิดใช้งานโมเดลข้อมูลที่ค้นหาได้ตามค่าเริ่มต้น คุณต้องทำเครื่องหมายแบบจำลองอย่างชัดเจนว่าสามารถค้นหาได้โดยใช้คุณลักษณะ Laravel\Scout\Searchable

คุณจะเริ่มต้นด้วยการสร้างแบบจำลองข้อมูลสำหรับแอปพลิเคชัน Train สาธิตและทำเครื่องหมายว่าสามารถค้นหาได้

วิธีสร้างแบบจำลอง

สำหรับแอปพลิเคชัน Train คุณจะต้องจัดเก็บชื่อตัวยึดตำแหน่งของแต่ละรถไฟที่มีอยู่

ดำเนินการคำสั่ง Artisan ด้านล่างเพื่อสร้างการย้ายข้อมูลและตั้งชื่อว่า create_trains_table

 php artisan make:migration create_trains_table
ทำการย้ายชื่อ create_trains_table
ทำการย้ายชื่อ create_trains_table

การย้ายข้อมูลจะถูกสร้างขึ้นในไฟล์ที่มีชื่อรวมชื่อที่ระบุและการประทับเวลาปัจจุบัน

เปิดไฟล์การย้ายข้อมูลที่อยู่ใน ไดเร็กทอรีฐานข้อมูล/การย้ายข้อมูล/

ในการเพิ่มคอลัมน์ชื่อเรื่อง ให้เพิ่มโค้ดต่อไปนี้ต่อจากคอลัมน์ id() ในบรรทัดที่ 17 โค้ดจะเพิ่มคอลัมน์ชื่อเรื่อง

 $table->string('title');

หากต้องการใช้การย้ายข้อมูล ให้ดำเนินการคำสั่งด้านล่าง

 php artisan migrate
การใช้การโยกย้ายช่างฝีมือ
การใช้การโยกย้ายช่างฝีมือ

หลังจากเรียกใช้การย้ายฐานข้อมูล ให้สร้างไฟล์ชื่อ Train.php ในไดเร็กทอรี app/Models/

วิธีเพิ่มคุณลักษณะ LaravelScoutSearchable

ทำเครื่องหมายโมเดล Train สำหรับการค้นหาโดยเพิ่มคุณลักษณะ Laravel\Scout\Searchable ให้กับโมเดล ดังที่แสดงด้านล่าง

 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Laravel\Scout\Searchable; class Train extends Model { use Searchable; public $fillable = ['title'];

นอกจากนี้ คุณต้องกำหนดค่าดัชนีการค้นหาโดยแทนที่วิธี searchable พฤติกรรมเริ่มต้นของ Scout จะคงรูปแบบไว้เพื่อให้ตรงกับชื่อตารางรุ่น

ดังนั้น ให้เพิ่มโค้ดต่อไปนี้ลงในไฟล์ Train.php ด้านล่างโค้ดจากบล็อกก่อนหน้า

 /** * Retrieve the index name for the model. * * @return string */ public function searchableAs() { return 'trains_index'; } }

วิธีใช้ Algolia กับลูกเสือ

สำหรับการค้นหาข้อความแบบเต็มครั้งแรกด้วย Laravel Scout คุณจะต้องใช้ไดรเวอร์ Algolia Algolia เป็นแพลตฟอร์มซอฟต์แวร์ในฐานะบริการ (SaaS) ที่ใช้ในการค้นหาข้อมูลจำนวนมาก มีเว็บแดชบอร์ดสำหรับนักพัฒนาในการจัดการดัชนีการค้นหาและ API ที่มีประสิทธิภาพซึ่งคุณสามารถเข้าถึงได้ผ่านชุดพัฒนาซอฟต์แวร์ (SDK) ในภาษาโปรแกรมที่คุณต้องการ

ภายในแอปพลิเคชัน Laravel คุณจะใช้แพ็คเกจไคลเอนต์ Algolia สำหรับ PHP

วิธีการตั้งค่าอัลโกเลีย

ก่อนอื่น คุณต้องติดตั้งแพ็คเกจไคลเอนต์การค้นหา Algolia PHP สำหรับแอปพลิเคชันของคุณ

ดำเนินการคำสั่งด้านล่าง

 composer require algolia/algoliasearch-client-php

ถัดไป คุณต้องตั้งค่า ID แอปพลิเคชันและข้อมูลรับรองคีย์ API ลับจาก Algolia ในไฟล์ .env

ใช้เว็บเบราว์เซอร์ของคุณ นำทางไปยังแดชบอร์ด Algolia ของคุณเพื่อรับ ID แอปพลิเคชันและข้อมูลรับรองคีย์ API ลับ

คลิกที่ การตั้งค่า ที่ด้านล่างของแถบด้านซ้ายมือเพื่อไปยังหน้า การตั้งค่า

จากนั้น คลิก คีย์ API ภายใน ส่วนทีมและการเข้าถึง ของหน้าการตั้งค่าเพื่อดูคีย์สำหรับบัญชี Algolia ของคุณ

ไปที่หน้าคีย์ API บน Algolia Cloud
หน้าคีย์ API บน Algolia Cloud

ที่หน้า API Keys ให้สังเกตค่า Application ID และ Admin API Key คุณจะใช้ข้อมูลรับรองเหล่านี้เพื่อตรวจสอบความถูกต้องของการเชื่อมต่อระหว่างแอปพลิเคชัน Laravel และ Algolia

การดู Application ID และ Admin API Keys จากหน้า Algolia API Keys
รหัสแอปพลิเคชันและคีย์ API ของผู้ดูแลระบบ

เพิ่มโค้ดด้านล่างลงในไฟล์ .env ของคุณโดยใช้ตัวแก้ไขโค้ด และแทนที่ตัวยึดตำแหน่งด้วยข้อมูลลับ Algolia API ที่สอดคล้องกัน

 ALGOLIA_APP_ID=APPLICATION_ID ALGOLIA_SECRET=ADMIN_API_KEY

นอกจากนี้ ให้แทนที่ตัวแปร SCOUT_DRIVER ด้วยโค้ดด้านล่างเพื่อเปลี่ยนค่าจาก meilisearch เป็น algolia การเปลี่ยนค่านี้จะสั่งให้ Scout ใช้ไดรเวอร์ Algolia

 SCOUT_DRIVER=algolia

วิธีสร้างตัวควบคุมแอปพลิเคชัน

ภายในไดเร็กทอรี app/Http/Controllers/ ให้สร้างไฟล์ TrainSearchController.php เพื่อจัดเก็บคอนโทรลเลอร์สำหรับแอปพลิเคชัน ตัวควบคุมจะแสดงรายการและเพิ่มข้อมูลไปยังโมเดล Train

เพิ่มบล็อกโค้ดต่อไปนี้ในไฟล์ TrainSearchController.php เพื่อสร้างคอนโทรลเลอร์

 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Models\Train; class TrainSearchController extends Controller { /** * Get the index name for the model. * * @return string */ public function index(Request $request) { if($request->has('titlesearch')){ $trains = Train::search($request->titlesearch) ->paginate(6); }else{ $trains = Train::paginate(6); } return view('Train-search',compact('trains')); } /** * Get the index name for the model. * * @return string */ public function create(Request $request) { $this->validate($request,['title'=>'required']); $trains = Train::create($request->all()); return back(); } }

วิธีสร้างเส้นทางแอปพลิเคชัน

ในขั้นตอนนี้ คุณจะสร้างเส้นทางสำหรับการแสดงรายการและเพิ่มรถไฟใหม่ไปยังฐานข้อมูล

เปิดไฟล์ route/web.php ของคุณและแทนที่โค้ดที่มีอยู่ด้วยบล็อกด้านล่าง

 <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\TrainSearchController; Route::get('/', function () { return view('welcome'); }); Route::get('trains-lists', [TrainSearchController::class, 'index']) -> name ('trains-lists'); Route::post('create-item', [TrainSearchController::class, 'create']) -> name ('create-item');

รหัสด้านบนกำหนดสองเส้นทางในแอปพลิเคชัน คำขอ GET สำหรับเส้นทาง /trains-lists แสดงข้อมูลรถไฟที่เก็บไว้ทั้งหมด คำขอ POST สำหรับเส้นทาง /create-item จะสร้างข้อมูลรถไฟใหม่

วิธีสร้างมุมมองแอปพลิเคชัน

สร้างไฟล์ภายในไดเร็กทอรี Resource/views/ และตั้งชื่อว่า Train-search.blade.php ไฟล์จะแสดงส่วนติดต่อผู้ใช้สำหรับฟังก์ชันการค้นหา

เพิ่มเนื้อหาของบล็อกโค้ดด้านล่างลงในไฟล์ Train-search.blade.php เพื่อสร้างหน้าเดียวสำหรับฟังก์ชันการค้นหา

 <!DOCTYPE html> <html> <head> <title>Laravel - Laravel Scout Algolia Search Example</title> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <div class="container"> <h2 class="text-bold">Laravel Full-Text Search Using Scout </h2><br/> <form method="POST" action="{{ route('create-item') }}" autocomplete="off"> @if(count($errors)) <div class="alert alert-danger"> <strong>Whoops!</strong> There is an error with your input. <br/> <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="row"> <div class="col-md-6"> <div class="form-group {{ $errors->has('title') ? 'has-error' : '' }}"> <input type="text" name="title" class="form-control" placeholder="Enter Title" value="{{ old('title') }}"> <span class="text-danger">{{ $errors->first('title') }}</span> </div> </div> <div class="col-md-6"> <div class="form-group"> <button class="btn btn-primary">Create New Train</button> </div> </div> </div> </form> <div class="panel panel-primary"> <div class="panel-heading">Train Management</div> <div class="panel-body"> <form method="GET" action="{{ route('trains-lists') }}"> <div class="row"> <div class="col-md-6"> <div class="form-group"> <input type="text" name="titlesearch" class="form-control" placeholder="Enter Title For Search" value="{{ old('titlesearch') }}"> </div> </div> <div class="col-md-6"> <div class="form-group"> <button class="btn btn-primary">Search</button> </div> </div> </div> </form> <table class="table"> <thead> <th>Id</th> <th>Train Title</th> <th>Creation Date</th> <th>Updated Date</th> </thead> <tbody> @if($trains->count()) @foreach($trains as $key => $item) <tr> <td>{{ ++$key }}</td> <td>{{ $item->title }}</td> <td>{{ $item->created_at }}</td> <td>{{ $item->updated_at }}</td> </tr> @endforeach @else <tr> <td colspan="4">No train data available</td> </tr> @endif </tbody> </table> {{ $trains->links() }} </div> </div> </div> </body> </html>

โค้ด HTML ด้านบนมีองค์ประกอบแบบฟอร์มพร้อมช่องป้อนข้อมูลและปุ่มสำหรับพิมพ์ชื่อรถไฟก่อนที่คุณจะบันทึกลงในฐานข้อมูล โค้ดยังมีตาราง HTML ที่แสดงรายละเอียด id , title , create_at และ updated_at ของรายการรถไฟภายในฐานข้อมูล

วิธีใช้การค้นหา Algolia

หากต้องการดูหน้า ให้ไปที่ http://127.0.0.1:8000/trains-lists จากเว็บเบราว์เซอร์ของคุณ

การดูข้อมูลรุ่นรถไฟที่แสดงภายในหน้ารายการรถไฟ
ข้อมูลโมเดลรถไฟ

ขณะนี้ฐานข้อมูลว่างเปล่า ดังนั้นคุณต้องป้อนชื่อรถไฟสาธิตในช่องป้อนข้อมูลและคลิก สร้างรถไฟใหม่ เพื่อบันทึก

แทรกรายการรถไฟใหม่
แทรกรายการรถไฟใหม่

หากต้องการใช้คุณลักษณะการค้นหา ให้พิมพ์คำสำคัญจากชื่อรถไฟที่บันทึกไว้ลงในช่องป้อนข้อมูล Enter Title For Search แล้วคลิก Search

ดังที่แสดงในภาพด้านล่าง เฉพาะรายการค้นหาที่มีคีย์เวิร์ดในชื่อเท่านั้นที่จะแสดง

การใช้คุณลักษณะการค้นหาเพื่อค้นหารายการรถไฟ
การใช้คุณลักษณะการค้นหาเพื่อค้นหารายการรถไฟ

Meilisearch กับ Laravel Scout

Meilisearch เป็นเครื่องมือค้นหาแบบโอเพ่นซอร์สที่เน้นความเร็ว ประสิทธิภาพ และประสบการณ์ของนักพัฒนาที่ได้รับการปรับปรุง มันแชร์ฟีเจอร์หลายอย่างกับ Algolia โดยใช้อัลกอริธึม โครงสร้างข้อมูล และการวิจัยแบบเดียวกัน แต่ใช้ภาษาโปรแกรมที่แตกต่างกัน

นักพัฒนาสามารถสร้างและโฮสต์อินสแตนซ์ Meilisearch ได้ด้วยตนเองภายในโครงสร้างพื้นฐานภายในองค์กรหรือระบบคลาวด์ Meilisearch ยังมีบริการเบต้าคลาวด์ที่คล้ายกับ Algolia สำหรับนักพัฒนาซอฟต์แวร์ที่ต้องการใช้ผลิตภัณฑ์โดยไม่ต้องจัดการโครงสร้างพื้นฐาน

ในบทช่วยสอน คุณมีอินสแตนซ์เฉพาะของ Meilisearch ที่รันอยู่ภายในคอนเทนเนอร์ Docker ของคุณแล้ว ตอนนี้คุณจะขยายฟังก์ชัน Laravel Scout เพื่อใช้อินสแตนซ์ Meilisearch

หากต้องการเพิ่ม Meilisearch ในแอปพลิเคชัน Laravel ให้เรียกใช้คำสั่งด้านล่างในเทอร์มินัลโปรเจ็กต์ของคุณ

 composer require meilisearch/meilisearch-php

ถัดไป คุณต้องแก้ไขตัวแปร Meilisearch ภายในไฟล์ .env เพื่อกำหนดค่า

แทนที่ตัวแปร SCOUT_DRIVER , MEILISEARCH_HOST และ MEILISEARCH_KEY ในไฟล์ .env ด้วยตัวแปรด้านล่าง

 SCOUT_DRIVER=meilisearch MEILISEARCH_HOST=http://127.0.0.1:7700 MEILISEARCH_KEY=LockKey

คีย์ SCOUT_DRIVER ระบุไดรเวอร์ที่ Scout ควรใช้ ในขณะที่ MEILISEARCH_HOST แสดงถึงโดเมนที่อินสแตนซ์ Meilisearch ของคุณทำงานอยู่ แม้ว่าจะไม่จำเป็นในระหว่างการพัฒนา แต่แนะนำให้เพิ่ม MEILISEARCH_KEY ในการผลิต

หมายเหตุ: แสดงความคิดเห็นเกี่ยวกับ Algolia ID และ Secret เมื่อใช้ Meilisearch เป็นไดรเวอร์ที่คุณต้องการ

หลังจากกำหนดค่า .env เสร็จแล้ว คุณควรจัดทำดัชนีระเบียนที่มีอยู่แล้วโดยใช้คำสั่ง Artisan ด้านล่าง

 php artisan scout:import "App\Models\Train"

Laravel Scout พร้อมโปรแกรมฐานข้อมูล

เอ็นจินฐานข้อมูลของ Scout อาจเหมาะสมที่สุดสำหรับแอปพลิเคชันที่ใช้ฐานข้อมูลขนาดเล็กหรือจัดการเวิร์กโหลดที่มีความเข้มข้นน้อยกว่า ปัจจุบัน เครื่องมือฐานข้อมูลรองรับ PostgreSQL และ MySQL

เอ็นจิ้นนี้ใช้ส่วนคำสั่ง "where-like" และดัชนีข้อความแบบเต็มกับฐานข้อมูลที่มีอยู่ของคุณ ทำให้สามารถค้นหาผลลัพธ์การค้นหาที่เกี่ยวข้องมากที่สุด คุณไม่จำเป็นต้องจัดทำดัชนีบันทึกของคุณเมื่อใช้เครื่องมือฐานข้อมูล

หากต้องการใช้เครื่องมือฐานข้อมูล คุณต้องตั้งค่าตัวแปร SCOUT_DRIVER .env เป็นฐานข้อมูล

เปิดไฟล์ .env ภายในแอปพลิเคชัน Laravel และเปลี่ยนค่าของตัวแปร SCOUT_DRIVER

 SCOUT_DRIVER = database

หลังจากเปลี่ยนไดรเวอร์ของคุณเป็นฐานข้อมูลแล้ว Scout จะเปลี่ยนไปใช้กลไกฐานข้อมูลสำหรับการค้นหาข้อความแบบเต็ม

Collection Engine พร้อม Laravel Scout

นอกจากเครื่องมือฐานข้อมูลแล้ว Scout ยังมีเครื่องมือรวบรวมอีกด้วย เครื่องมือนี้ใช้ส่วนคำสั่ง "where" และการกรองคอลเลกชันเพื่อแยกผลการค้นหาที่เกี่ยวข้องมากที่สุด

ซึ่งแตกต่างจากเอ็นจิ้นฐานข้อมูล เอ็นจิ้นการรวบรวมรองรับฐานข้อมูลเชิงสัมพันธ์ทั้งหมดที่ Laravel รองรับเช่นกัน

คุณสามารถใช้กลไกการรวบรวมโดยตั้งค่าตัวแปรสภาพแวดล้อม SCOUT_DRIVER เป็น collection หรือโดยการระบุไดรเวอร์การรวบรวมด้วยตนเองในไฟล์คอนฟิกูเรชันของ Scout

 SCOUT_DRIVER = collection

Explorer ด้วย Elasticsearch

ด้วยความแข็งแกร่งของข้อความค้นหาของ Elasticsearch Explorer จึงเป็นไดรเวอร์ Elasticsearch ที่ทันสมัยสำหรับ Laravel Scout มีไดรเวอร์ของ Scout ที่เข้ากันได้และคุณประโยชน์ต่างๆ เช่น การจัดเก็บ ค้นหา และวิเคราะห์ข้อมูลจำนวนมหาศาลในแบบเรียลไทม์ Elasticsearch กับ Laravel ให้ผลลัพธ์เป็นมิลลิวินาที

หากต้องการใช้ไดรเวอร์ Elasticsearch Explorer ในแอปพลิเคชัน Laravel คุณจะต้องกำหนดค่าไฟล์สำเร็จรูปนักเทียบ ท่า-compose.yml ที่สคริปต์ Laravel-Scout สร้างขึ้น คุณจะเพิ่มการกำหนดค่าเพิ่มเติมสำหรับ Elasticsearch และรีสตาร์ทคอนเทนเนอร์

เปิดไฟล์ docker-compose.yml ของคุณและแทนที่เนื้อหาด้วยสิ่งต่อไปนี้

 # For more information: https://laravel.com/docs/sail version: '3' services: laravel.test: build: context: ./vendor/laravel/sail/runtimes/8.1 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' image: sail-8.1/app extra_hosts: - 'host.docker.internal:host-gateway' ports: - '${APP_PORT:-80}:80' - '${VITE_PORT:-5173}:${VITE_PORT:-5173}' environment: WWWUSER: '${WWWUSER}' LARAVEL_SAIL: 1 XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}' XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}' volumes: - '.:/var/www/html' networks: - sail depends_on: - mysql - redis - meilisearch - mailhog - selenium - pgsql - elasticsearch mysql: image: 'mysql/mysql-server:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: "%" MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sail-mysql:/var/lib/mysql' - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' networks: - sail healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] retries: 3 timeout: 5s elasticsearch: image: 'elasticsearch:7.13.4' environment: - discovery.type=single-node ports: - '9200:9200' - '9300:9300' volumes: - 'sailelasticsearch:/usr/share/elasticsearch/data' networks: - sail kibana: image: 'kibana:7.13.4' environment: - elasticsearch.hosts=http://elasticsearch:9200 ports: - '5601:5601' networks: - sail depends_on: - elasticsearch redis: image: 'redis:alpine' ports: - '${FORWARD_REDIS_PORT:-6379}:6379' volumes: - 'sail-redis:/data' networks: - sail healthcheck: test: ["CMD", "redis-cli", "ping"] retries: 3 timeout: 5s pgsql: image: 'postgres:13' ports: - '${FORWARD_DB_PORT:-5432}:5432' environment: PGPASSWORD: '${DB_PASSWORD:-secret}' POSTGRES_DB: '${DB_DATABASE}' POSTGRES_USER: '${DB_USERNAME}' POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}' volumes: - 'sailpgsql:/var/lib/postgresql/data' networks: - sail healthcheck: test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"] retries: 3 timeout: 5s meilisearch: image: 'getmeili/meilisearch:latest' ports: - '${FORWARD_MEILISEARCH_PORT:-7700}:7700' volumes: - 'sail-meilisearch:/meili_data' networks: - sail healthcheck: test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"] retries: 3 timeout: 5s mailhog: image: 'mailhog/mailhog:latest' ports: - '${FORWARD_MAILHOG_PORT:-1025}:1025' - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025' networks: - sail selenium: image: 'selenium/standalone-chrome' extra_hosts: - 'host.docker.internal:host-gateway' volumes: - '/dev/shm:/dev/shm' networks: - sail networks: sail: driver: bridge volumes: sail-mysql: driver: local sail-redis: driver: local sail-meilisearch: driver: local sailpgsql: driver: local sailelasticsearch: driver: local

ถัดไป ให้เรียกใช้คำสั่งด้านล่างเพื่อดึงรูปภาพ Elasticsearch ใหม่ที่คุณเพิ่มไปยังไฟล์ docker-compose.yml

 docker-compose up

จากนั้นดำเนินการคำสั่ง Composer ด้านล่างเพื่อติดตั้ง Explorer ในโครงการ

 composer require jeroen-g/explorer

คุณต้องสร้างไฟล์การกำหนดค่าสำหรับไดรเวอร์ Explorer ด้วย

ดำเนินการคำสั่ง Artisan ด้านล่างเพื่อสร้างไฟล์ explorer.config สำหรับจัดเก็บการกำหนดค่า

 php artisan vendor:publish --tag=explorer.config

ไฟล์การกำหนดค่าที่สร้างขึ้นด้านบนจะอยู่ในไดเร็กทอรี /config

ในไฟล์ config/explorer.php ของคุณ คุณสามารถอ้างอิงโมเดลของคุณโดยใช้คีย์ indexes

 'indexes' => [ \App\Models\Train::class ],

เปลี่ยนค่าของตัวแปร SCOUT_DRIVER ภายในไฟล์ .env เป็น elastic เพื่อกำหนดค่าให้ Scout ใช้ไดรเวอร์ Explorer

 SCOUT_DRIVER = elastic

ณ จุดนี้ คุณจะใช้ Explorer ภายในโมเดล Train โดยใช้อินเทอร์เฟซ Explorer และแทนที่เมธอด mappableAs()

เปิดไฟล์ Train.php ภายในไดเร็กทอรี App > Models และแทนที่โค้ดที่มีอยู่ด้วยโค้ดด้านล่าง

 <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use JeroenG\Explorer\Application\Explored; use Laravel\Scout\Searchable; class Train extends Model implements Explored { use HasFactory; use Searchable; protected $fillable = ['title']; public function mappableAs(): array { return [ 'id'=>$this->Id, 'title' => $this->title, ]; } }

ด้วยโค้ดที่คุณเพิ่มไว้ด้านบน ตอนนี้คุณสามารถใช้ Explorer เพื่อค้นหาข้อความภายในโมเดล Train ได้แล้ว

Laravel + Scout = การผสานรวมการค้นหาข้อความแบบเต็มที่รวดเร็ว แข็งแกร่ง และสะอาดตา สร้างแอปตัวอย่างและลองใช้คู่มือนี้ ️ คลิกเพื่อทวีต

สรุป

สำหรับนักพัฒนา PHP นั้น Laravel และส่วนเสริมเช่น Scout ทำให้การผสานรวมฟังก์ชันการค้นหาข้อความแบบเต็มที่รวดเร็วและมีประสิทธิภาพเป็นเรื่องง่าย ด้วย Database Engine, Collection Engine และความสามารถของ Meilisearch และ Elasticsearch คุณสามารถโต้ตอบกับฐานข้อมูลของแอปและใช้กลไกการค้นหาขั้นสูงได้ในเวลาเพียงไม่กี่มิลลิวินาที

การจัดการและอัปเดตฐานข้อมูลของคุณอย่างราบรื่นหมายความว่าผู้ใช้ของคุณจะได้รับประสบการณ์ที่ดีที่สุดในขณะที่รหัสของคุณยังคงสะอาดและมีประสิทธิภาพ

ด้วยโซลูชันการโฮสต์แอปพลิเคชันและฐานข้อมูล Kinsta เป็นร้านค้าครบวงจรสำหรับความต้องการการพัฒนา Laravel ที่ทันสมัยทั้งหมดของคุณ $20 แรกเป็นของเรา