Algolia Search เป็นเครื่องมือค้นหาข้อความแบบเต็ม ตัวเลข และ faceted ที่สามารถแสดงผลลัพธ์แบบเรียลไทม์ได้ตั้งแต่การกดแป้นพิมพ์ครั้งแรก
แพ็คเกจนี้เลิกใช้แล้ว เราขอแนะนำให้คุณใช้ Laravel Scout หากคุณต้องการขยายขีดความสามารถของ Scout โปรดดูเอกสารเฉพาะของเรา
แพ็คเกจ PHP นี้รวม Algolia Search API เข้ากับ Laravel Eloquent ORM มันขึ้นอยู่กับแพ็คเกจ algoliasearch-client-php
หมายเหตุ: หากคุณใช้ Laravel 4 ให้ชำระเงินที่เก็บ algoliasearch-laravel-4
คุณสามารถดูข้อมูลอ้างอิงฉบับเต็มได้จากเว็บไซต์ของ Algolia
ติดตั้ง
เริ่มต้นอย่างรวดเร็ว
ตัวเลือก
objectID
แบบกำหนดเองความสัมพันธ์
การจัดทำดัชนี
จัดการดัชนี
ความเข้ากันได้แบบฝีปาก
เพิ่ม algolia/algoliasearch-laravel
ลงในไฟล์ composer.json
ของคุณ:
composer require algolia/algoliasearch-laravel
เพิ่มผู้ให้บริการเพื่อ config/app.php
ในอาร์เรย์ providers
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
Laravel Algolia ต้องการการกำหนดค่าการเชื่อมต่อ ในการเริ่มต้น คุณจะต้องเผยแพร่สินทรัพย์ของผู้ขายทั้งหมด:
php artisan vendor:publish
คุณสามารถเพิ่มตัวเลือก --provider="VinklaAlgoliaAlgoliaServiceProvider"
เพื่อเผยแพร่เฉพาะเนื้อหาของแพ็คเกจ Algolia
สิ่งนี้จะสร้างไฟล์ config/algolia.php
ในแอปของคุณซึ่งคุณสามารถแก้ไขได้เพื่อตั้งค่าคอนฟิกูเรชันของคุณ นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณตรวจสอบการเปลี่ยนแปลงโดยเปรียบเทียบกับไฟล์กำหนดค่าดั้งเดิมหลังการอัปเกรด
รหัสต่อไปนี้เพิ่มความสามารถในการค้นหาให้กับโมเดล Contact
ของคุณโดยสร้างดัชนี Contact
:
use Illuminate Database Eloquent Model ;
use AlgoliaSearch Laravel AlgoliaEloquentTrait ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
}
ตามค่าเริ่มต้นแอตทริบิวต์ที่มองเห็นได้ทั้งหมดจะถูกส่งไป หากคุณต้องการส่งแอตทริบิวต์เฉพาะ คุณสามารถดำเนินการดังนี้:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function getAlgoliaRecord ()
{
return array_merge ( $ this -> toArray (), [
' custom_name ' => ' Custom Name '
]);
}
}
หลังจากตั้งค่าโมเดลแล้ว คุณจะต้องนำเข้าข้อมูลเบื้องต้นด้วยตนเอง คุณสามารถทำได้โดยการเรียก reindex
บนคลาสโมเดลของคุณ จากตัวอย่างก่อนหน้าของเรา นี่จะเป็น:
Contact :: reindex ();
เรามีหลายวิธีในการกำหนดค่าการตั้งค่าดัชนีของคุณเพื่อปรับแต่งความเกี่ยวข้องโดยรวม แต่สิ่งที่สำคัญที่สุดคือ แอตทริบิวต์ที่ค้นหาได้ และแอตทริบิวต์ที่สะท้อนถึง ความนิยมของบันทึก คุณสามารถกำหนดค่าได้ด้วยรหัสต่อไปนี้:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
];
}
คุณสามารถเผยแพร่ (บันทึก) การตั้งค่าไปยังอัลโกเลียได้โดยใช้วิธี setSetting
:
Contact :: setSettings ();
คำพ้องความหมายใช้เพื่อบอกกลไกเกี่ยวกับคำหรือสำนวนที่ควรถือว่าเท่าเทียมกันโดยคำนึงถึงความเกี่ยวข้องของข้อความ
API คำพ้องความหมายของเราได้รับการออกแบบมาให้จัดการชุดคำพ้องความหมายจำนวนมากสำหรับดัชนีและแบบจำลองได้ง่ายที่สุดเท่าที่จะเป็นไปได้
คุณสามารถใช้ API คำพ้องความหมายได้โดยการเพิ่ม synonyms
ในคุณสมบัติคลาส $algoliaSettings
ดังนี้:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' synonyms ' => [
[
' objectID ' => ' red-color ' ,
' type ' => ' synonym ' ,
' synonyms ' => [ ' red ' , ' another red ' , ' yet another red ' ]
]
]
];
}
คุณสามารถเผยแพร่ (บันทึก) การตั้งค่าไปยังอัลโกเลียโดยใช้วิธี setSetting
:
Contact :: setSettings ();
การใช้งานการค้นหาแบบดั้งเดิมมักจะมีตรรกะการค้นหาและฟังก์ชันการทำงานอยู่ที่แบ็กเอนด์ การดำเนินการนี้สมเหตุสมผลเมื่อประสบการณ์การค้นหาประกอบด้วยผู้ใช้ที่ป้อนคำค้นหา ดำเนินการค้นหานั้น จากนั้นถูกเปลี่ยนเส้นทางไปยังหน้าผลการค้นหา
การดำเนินการค้นหาบนแบ็กเอนด์ไม่จำเป็นอีกต่อไป ในความเป็นจริง ในกรณีส่วนใหญ่จะเป็นอันตรายต่อประสิทธิภาพการทำงานเนื่องจากมีเครือข่ายเพิ่มเติมและเวลาแฝงในการประมวลผล เราขอแนะนำเป็นอย่างยิ่งให้ใช้ไคลเอนต์ JavaScript API ของเราเพื่อออกคำขอค้นหาทั้งหมดโดยตรงจากเบราว์เซอร์ อุปกรณ์มือถือ หรือไคลเอนต์ของผู้ใช้ปลายทาง มันจะลดเวลาแฝงในการค้นหาโดยรวมในขณะที่ลดการโหลดเซิร์ฟเวอร์ของคุณในเวลาเดียวกัน
ในโค้ด JavaScript ของคุณ คุณสามารถทำได้:
var client = algoliasearch ( 'ApplicationID' , 'Search-Only-API-Key' ) ;
var index = client . initIndex ( 'YourIndexName' ) ;
index . search ( 'something' , function ( success , hits ) {
console . log ( success , hits )
} , { hitsPerPage : 10 , page : 0 } ) ;
คุณยังสามารถใช้วิธี search
ได้ แต่ไม่แนะนำให้ใช้ประสบการณ์การค้นหาทันที/เรียลไทม์จากแบ็กเอนด์ (การค้นหาส่วนหน้าจะทำให้ผู้ใช้ได้รับประสบการณ์ที่ดีขึ้น):
Contact :: search ( ' jon doe ' );
แต่ละครั้งที่มีการบันทึกบันทึก มันจะเป็น - แบบอะซิงโครนัส - จัดทำดัชนี ในทางกลับกัน แต่ละครั้งที่บันทึกถูกทำลาย บันทึกจะถูกลบออกจากดัชนีแบบอะซิงโครนัส
คุณสามารถปิดใช้งานการสร้างดัชนีอัตโนมัติและการลบอัตโนมัติได้โดยการตั้งค่าตัวเลือกต่อไปนี้:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ autoIndex = false ;
public static $ autoDelete = false ;
}
คุณสามารถปิดใช้งานการจัดทำดัชนีอัตโนมัติได้ชั่วคราว ซึ่งมักทำด้วยเหตุผลด้านประสิทธิภาพ
Contact :: $ autoIndex = false ;
Contact :: clearIndices ();
for ( $ i = 0 ; $ i < 10000 ; $ i ++) {
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
}
Contact :: reindex (); // Will use batch operations.
Contact :: $ autoIndex = true ;
คุณยังสามารถสร้างเงื่อนไขแบบไดนามิกสำหรับพารามิเตอร์ทั้งสองได้โดยการสร้างเมธอด autoIndex
และ/หรือ autoDelete method
บนโมเดลของคุณ
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function autoIndex ()
{
if ( App :: environment () === ' test ' ) {
return false ;
}
return true ;
}
public static autoDelete()
{
if ( App ::environment() === 'test') {
return false ;
}
return true ;
}
}
โปรดใช้ความระมัดระวังในการกำหนดทั้งสองวิธีใน AlgoliaEloquentTrait เมื่อวางวิธีการเหล่านั้นในคลาสพาเรนต์ พวกเขาจะถูก "ลบ" โดย AlgoliaEloquentTrait หากใช้ในคลาสลูก (เนื่องจากการสืบทอด php)
ตามค่าเริ่มต้น ชื่อดัชนีจะเป็นชื่อคลาสพหูพจน์ เช่น "ผู้ติดต่อ" คุณสามารถปรับแต่งชื่อดัชนีได้โดยใช้ตัวเลือก $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [ ' contact_all ' ];
}
คุณสามารถต่อท้ายชื่อดัชนีด้วยสภาพแวดล้อมของแอปปัจจุบันได้โดยใช้ตัวเลือกต่อไปนี้:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ perEnvironment = true ; // Index name will be 'Contacts_{App::environnement()}';
}
objectID
แบบกำหนดเอง ตามค่าเริ่มต้น objectID
จะขึ้นอยู่กับ keyName
ของบันทึกของคุณ ( id
โดยค่าเริ่มต้น) คุณสามารถเปลี่ยนลักษณะการทำงานนี้โดยระบุตัวเลือก objectIdKey
(ต้องแน่ใจว่าใช้ฟิลด์ uniq)
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ objectIdKey = ' new_key ' ;
}
คุณสามารถเพิ่มข้อจำกัดเพื่อควบคุมว่าระเบียนจะต้องได้รับการจัดทำดัชนีโดยการกำหนดเมธอด indexOnly()
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function indexOnly ( $ index_name )
{
return ( bool ) $ condition ;
}
}
ตามค่าเริ่มต้น แพ็คเกจ Algolia จะดึงข้อมูลความสัมพันธ์ ที่โหลด
หากคุณต้องการสร้างดัชนีเรกคอร์ดที่ยังไม่ได้โหลดความสัมพันธ์ใดๆ คุณสามารถทำได้โดยโหลดเรกคอร์ดเหล่านั้นใน getAlgoliaRecord
ที่คุณสามารถสร้างในแบบจำลองของคุณ
มันจะมีลักษณะดังนี้:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ this -> categories ;
return $ this -> toArray ();
}
ในวัตถุผลลัพธ์ คุณจะมีหมวดหมู่ที่แปลงเป็นอาร์เรย์โดย Laravel หากคุณต้องการโครงสร้างความสัมพันธ์แบบกำหนดเอง คุณจะต้องดำเนินการดังนี้:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ extra_data = [];
$ extra_data [ ' categories ' ] = array_map ( function ( $ data ) {
return $ data [ ' name ' ];
}, $ this -> categories -> toArray ());
return array_merge ( $ this -> toArray (), $ extra_data );
}
ตามค่าเริ่มต้น Algolia จะสามารถเข้าถึงเฉพาะคุณลักษณะ ที่มองเห็นได้ ของโมเดลของคุณเท่านั้น ตัวอย่างเช่น คุณจะได้รับข้อยกเว้น No content in PUT request
เมื่อใช้โค้ดตัวอย่างนี้ เนื่องจากคีย์ invisible_attribute
จะส่งกลับตัวแปรว่าง/null
protected $ visible = [ ' visible_attribute ' , ' other_visible_attribute ' ];
public function getAlgoliaRecord ()
{
return [
' invisible_attribute ' => $ this -> invisible_attribute
];
}
ก่อนจัดทำดัชนี ต้องแน่ใจว่าได้ระบุแอตทริบิวต์ที่มองเห็นได้ของคุณอย่างถูกต้อง ในการเลี่ยงผ่านหน้ากากนิรภัยที่กำหนดโดย Laravel คุณสามารถใช้ $this->attributes['invisible_attribute']
เพื่อเข้าถึงแอตทริบิวต์โดยตรงแม้ว่าจะมองไม่เห็นก็ตาม แต่คำแนะนำคือให้หลีกเลี่ยงการเข้าถึงแอตทริบิวต์ประเภทนี้ในโมเดลของคุณ
คุณสามารถทริกเกอร์การสร้างดัชนีโดยใช้เมธอดอินสแตนซ์ pushToIndex
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> pushToIndex ();
และทริกเกอร์การลบโดยใช้วิธี removeFromIndex
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> removeFromIndex ();
หากต้องการจัดทำดัชนีบันทึกทั้งหมดของคุณ ใหม่อย่างปลอดภัย (จัดทำดัชนีเป็นดัชนีชั่วคราว + ย้ายดัชนีชั่วคราวไปยังดัชนีปัจจุบันแบบอะตอมมิก) ให้ใช้วิธีการคลาส reindex
:
Contact :: reindex ();
หากต้องการจัดทำดัชนีบันทึกทั้งหมดของคุณใหม่ (แทนที่โดยไม่ลบบันทึกที่ล้าสมัย):
Contact :: reindex ( false );
หากต้องการตั้งค่าระหว่างกระบวนการจัดทำดัชนีใหม่:
Contact :: reindex ( true , true );
หากต้องการเก็บการตั้งค่าที่คุณตั้งไว้ในแดชบอร์ด Algolia เมื่อจัดทำดัชนีใหม่และเปลี่ยนการตั้งค่า:
Contact :: reindex ( true , true , true );
หากต้องการใช้การโทรกลับที่ได้รับการเรียกทุกครั้งที่มีการจัดทำดัชนีชุดเอนทิตี:
Contact :: reindex ( true , true , false , function ( $ entities )
{
foreach ( $ entities as $ entity )
{
var_dump ( $ entity -> id ); // Contact::$id
}
});
หากต้องการล้างดัชนี ให้ใช้เมธอดคลาส clearIndices
:
Contact :: clearIndices ( ) ;
คุณสามารถกำหนดดัชนีเรพลิกาได้โดยใช้ตัวแปร $algolia_settings
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
' replicas ' => [
' contacts_desc ' ,
],
];
public $ replicasSettings = [
' contacts_desc ' => [
' ranking ' => [
' desc(name) ' ,
' typo ' ,
' geo ' ,
' words ' ,
' proximity ' ,
' attribute ' ,
' exact ' ,
' custom '
]
]
];
}
หากต้องการค้นหาโดยใช้แบบจำลอง ให้ใช้รหัสต่อไปนี้:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_desc ' ]);
คุณสามารถจัดทำดัชนีบันทึกในหลายดัชนีโดยใช้คุณสมบัติ $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [
' contact_public ' ,
' contact_private ' ,
];
public function indexOnly ( $ indexName )
{
if ( $ indexName == ' contact_public ' )
return true ;
return $ this -> private ;
}
}
หากต้องการค้นหาโดยใช้ดัชนีพิเศษ ให้ใช้รหัสต่อไปนี้:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_private ' ]);
ทำ:
Ad :: where ( ' id ' , $ id )-> update ( $ attributes );
จะไม่ทริกเกอร์สิ่งใดในโมเดล (ดังนั้นจะไม่มีการอัพเดตใน Algolia) ทั้งนี้เพราะว่ามันไม่ใช่การเรียกที่มีฝีปาก มันเป็นเพียงวิธีที่สะดวกในการสร้างแบบสอบถามที่ซ่อนอยู่หลังโมเดล
เพื่อให้แบบสอบถามนี้ทำงานกับ Algolia คุณต้องทำดังนี้:
Ad :: find ( $ id )-> update ( $ attributes );
เข้ากันได้กับแอปพลิเคชัน 5.x