Расширение обеспечивает простой полнотекстовый поиск с идеями, полученными от Laravel/Scout и Base On TeamTNT/TNTSearch Orbper для активной записи YII2.
Требуется поиск 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 '
]
] По умолчанию компонент будет добавлен в компоненты вашего приложения через начальную загрузку с помощью идентификационного 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 в классе модели активной записи:
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 ;
}
} По умолчанию первичное имя ключа модели как уникальный идентификатор, хранящийся в индексе поиска. Если вам нужно настроить это поведение, вы можете переопределить статический метод 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где -то, потому что он будет переопределять результат состояния идентификаторов поиска.
$ 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, чтобы увидеть полный документ.