ส่วนขยายให้การค้นหาข้อความแบบเต็มรูปแบบง่าย ๆ พร้อมไอเดียได้รับจาก Laravel/Scout และฐานบน wrapper Teamtnt/tntsearch สำหรับ Yii2 Active Record
ต้องการ yii2 ที่ค้นหาได้โดยใช้นักแต่งเพลง:
composer require vxm/yii2-searchable ในที่สุดเพิ่มลักษณะ vxmsearchableSearchableTrait และแนบพฤติกรรม vxmsearchableSearchableBehavior ไปยังบันทึกที่ใช้งานอยู่ที่คุณต้องการค้นหาได้ สิ่งนี้จะช่วยซิงค์โมเดลกับข้อมูลดัชนี
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}ในขณะที่ไม่จำเป็นต้องใช้ส่วนขยายนี้อย่างเคร่งครัดคุณควรพิจารณาการกำหนดค่า Yii2-queue ก่อนที่จะใช้ส่วนขยาย การใช้งานคิวคนงานจะอนุญาตให้คิวการดำเนินการทั้งหมดที่ซิงค์ข้อมูลโมเดลของคุณกับดัชนีการค้นหาของคุณซึ่งให้เวลาตอบสนองที่ดีขึ้นสำหรับเว็บอินเตอร์เฟสของแอปพลิเคชันของคุณ
เมื่อคุณกำหนดค่าส่วนประกอบคิวให้ตั้งค่าตัวเลือกคิวในไฟล์การกำหนดค่าแอปพลิเคชันของคุณเป็นรหัสส่วนประกอบของมันหรือการกำหนดค่าอาร์เรย์ของมัน
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] โดยค่าเริ่มต้นส่วนประกอบจะถูกเพิ่มลงในส่วนประกอบแอปพลิเคชันของคุณผ่าน bootstrapping ด้วย ID searchable หากคุณต้องการกำหนดค่าคุณสามารถกำหนดค่าด้วยตนเองในไฟล์กำหนดค่าแอปพลิเคชันของคุณ:
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' storagePath ' => ' @runtime/vxm/search ' ,
' queue ' => null , // an optional not required
' defaultSearchMode ' => vxm searchable Searchable:: FUZZY_SEARCH ,
' asYouType ' => false ,
' fuzziness ' => false ,
' fuzzyPrefixLength ' => 2 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyDistance ' => 50
]
] แต่ละโมเดลที่ใช้งานอยู่จะถูกซิงค์กับ index การค้นหาที่กำหนดซึ่งมีระเบียนที่ค้นหาได้ทั้งหมดสำหรับรุ่นนั้น กล่าวอีกนัยหนึ่งคุณสามารถนึกถึงดัชนีแต่ละตัวเช่นตาราง MySQL โดยค่าเริ่มต้นแต่ละรุ่นจะคงอยู่กับดัชนีที่ตรงกับชื่อ table ทั่วไปของโมเดล โดยทั่วไปนี่คือรูปแบบพหูพจน์ของชื่อโมเดล อย่างไรก็ตามคุณมีอิสระที่จะปรับแต่งชื่อ index โดยการเอาชนะวิธีการ searchableIndex Static ในคลาสโมเดลบันทึกที่ใช้งานอยู่:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the index name for the model class.
*
* @return string
*/
public static function searchableIndex (): string
{
return ' articles_index ' ;
}
} โดยค่าเริ่มต้นรูปแบบ toArray ทั้งหมดของโมเดลที่กำหนดจะคงอยู่กับดัชนีการค้นหา หากคุณต้องการปรับแต่งข้อมูลที่ซิงโครไนซ์กับดัชนีการค้นหาคุณสามารถแทนที่วิธี toSearchableArray ในรุ่น:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray (): array
{
$ array = $ this -> toArray ();
// Customize array...
return $ array ;
}
} โดยค่าเริ่มต้นชื่อคีย์หลักของโมเดลเป็น ID ที่ไม่ซ้ำกันที่เก็บไว้ในดัชนีการค้นหา หากคุณต้องการปรับแต่งพฤติกรรมนี้คุณอาจแทนที่วิธีการค้นหาแบบคงที่ searchableKey ในโมเดล:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get searchable key by default primary key will be use.
*
* @return string key name.
*/
public static function searchableKey (): string
{
return ' id ' ;
}
}หากคุณกำลังติดตั้งส่วนขยายในโครงการที่มีอยู่คุณอาจมีบันทึกฐานข้อมูลที่คุณต้องนำเข้าสู่ไดรเวอร์ค้นหาของคุณ ส่วนขยายนี้ให้การดำเนินการนำเข้าที่คุณอาจใช้ในการนำเข้าระเบียนที่มีอยู่ทั้งหมดของคุณลงในดัชนีการค้นหาของคุณ:
php yii searchable/import -- models ="app models Post " คุณสามารถนำเข้าคลาส Multi Model โดยตัวคั่น ,
php yii searchable/import -- models ="app models Post , app models Category " เมื่อคุณเพิ่ม vxmsearchableSearchableTrait และแนบพฤติกรรม vxmsearchableSearchableBehavior เข้ากับโมเดลสิ่งที่คุณต้องทำคือบันทึกอินสแตนซ์ของแบบจำลองและจะถูกเพิ่มลงในดัชนีการค้นหาของคุณโดยอัตโนมัติ หากคุณกำหนดค่าคิวการดำเนินการนี้จะดำเนินการในพื้นหลังโดยพนักงานคิวของคุณ:
$ post = new app models Post ;
// ...
$ post -> save (); หากคุณต้องการเพิ่มผลลัพธ์การสืบค้นที่ใช้งานอยู่ในดัชนีการค้นหาของคุณคุณสามารถใช้วิธี makeSearchable บนผลลัพธ์การสืบค้นที่ใช้งานอยู่ วิธี makeSearchable จะพิมพ์ผลลัพธ์ของแบบสอบถามและเพิ่มระเบียนลงในดัชนีการค้นหาของคุณ อีกครั้งหากคุณได้กำหนดค่าคิวทุกชิ้นจะถูกเพิ่มในพื้นหลังโดยพนักงานคิวของคุณ:
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); วิธี makeSearchable ถือได้ว่าเป็นการดำเนินการ upsert กล่าวอีกนัยหนึ่งหากบันทึกโมเดลอยู่ในดัชนีของคุณแล้วมันจะได้รับการอัปเดต หากไม่มีอยู่ในดัชนีการค้นหาจะถูกเพิ่มเข้าไปในดัชนี
ในการอัปเดตโมเดลที่ค้นหาได้คุณจะต้องอัปเดตคุณสมบัติของอินสแตนซ์แบบจำลองและบันทึกโมเดลลงในฐานข้อมูลของคุณเท่านั้น ส่วนขยายนี้จะคงการเปลี่ยนแปลงดัชนีการค้นหาของคุณโดยอัตโนมัติ:
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); นอกจากนี้คุณยังสามารถใช้วิธี makeSearchable ในคลาสบันทึกที่ใช้งานอยู่เพื่ออัปเดตอินสแตนซ์ หากโมเดลไม่มีอยู่ในดัชนีการค้นหาของคุณพวกเขาจะถูกสร้างขึ้น:
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );ในการลบบันทึกจากดัชนีของคุณให้ลบโมเดลออกจากฐานข้อมูล:
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); หากคุณต้องการลบผลลัพธ์การสืบค้นที่ใช้งานอยู่จากดัชนีการค้นหาของคุณคุณสามารถใช้วิธี deleteSearchable ในคลาสบันทึกที่ใช้งานอยู่:
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); บางครั้งคุณอาจต้องดำเนินการชุดการดำเนินการบันทึกที่ใช้งานอยู่บนโมเดลโดยไม่ต้องซิงค์ข้อมูลโมเดลไปยังดัชนีการค้นหาของคุณ คุณสามารถทำได้โดยใช้วิธีการ withoutSyncingToSearch วิธีการค้นหา วิธีนี้ยอมรับการโทรกลับครั้งเดียวซึ่งจะถูกดำเนินการทันที การดำเนินการแบบจำลองใด ๆ ที่เกิดขึ้นภายในการโทรกลับจะไม่ถูกซิงค์กับดัชนีของโมเดล:
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); บางครั้งคุณอาจต้องสร้างแบบจำลองที่ค้นหาได้ภายใต้เงื่อนไขบางประการเท่านั้น ตัวอย่างเช่นลองจินตนาการว่าคุณมี appmodelsArticle ที่อาจอยู่ในหนึ่งในสองรัฐ: draft และ published คุณอาจต้องการให้โพสต์ published สามารถค้นหาได้เท่านั้น ในการทำสิ่งนี้ให้สำเร็จคุณอาจกำหนดวิธีการค้นหา shouldBeSearchable ในโมเดลของคุณ:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Determine if the model should be searchable.
*
* @return bool
*/
public static function shouldBeSearchable ()
{
return $ this -> is_published ;
}
} วิธีการ shouldBeSearchable จะถูกนำไปใช้เฉพาะเมื่อจัดการโมเดลผ่านวิธีการบันทึก การสร้างแบบจำลองโดยตรงโดยใช้วิธี searchable หรือ makeSearchable จะแทนที่ผลลัพธ์ของวิธีการ shouldBeSearchable :
// Will respect "shouldBeSearchable"...
$ post = app models Post:: findOne ( 1 );
$ post -> save ();
// Will override "shouldBeSearchable"...
$ post -> searchable ();
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); คุณอาจเริ่มค้นหาแบบจำลองโดยใช้วิธี search วิธีการค้นหายอมรับสตริงเดียวที่จะใช้ในการค้นหาโมเดลของคุณ วิธีนี้ส่งคืน ActiveQuery คุณสามารถเพิ่มเงื่อนไขหรือความสัมพันธ์เพิ่มเติมเช่นการสืบค้นต้นทาง
หมายเหตุเมื่อเพิ่มเงื่อนไขการสืบค้นเพิ่มเติมคุณจะต้องไม่ใช้
whereใช้วิธีการandWhereหรือorWhereก็ตามเพราะจะแทนที่ผลลัพธ์เงื่อนไข IDS การค้นหา
$ posts = app models Post:: search ( ' vxm ' )-> all ();
$ posts = app models Post:: search ( ' vxm ' )-> andWhere ([ ' author_id ' => 1 ])-> all ();
// not use
$ posts = app models Post:: search ( ' vxm ' )-> where ([ ' author_id ' => 1 ])-> all (); คุณสามารถเข้าร่วมความสัมพันธ์ในการค้นหาด้วยความสัมพันธ์สนับสนุน searchable :
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); คุณสามารถเลือกโหมดการค้นหา boolean หรือ fuzzy เป็นพารามิเตอร์ที่สองหากไม่ได้ตั้งค่า defaultSearchMode ของส่วนประกอบ Searchable จะถูกใช้:
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();สำหรับรายละเอียดเพิ่มเติมของโหมดการค้นหาโปรดดูที่ Teamtnt/tntSearch เพื่อดูเอกสารฉบับเต็ม