Una extensión proporciona una búsqueda simple de texto completo con ideas de Laravel/Scout y Base en TeamTnt/TNTSearch Wrapper para el registro activo YII2.
Requiere yii2 de búsqueda usando el compositor:
composer require vxm/yii2-searchable Finalmente, agregue el rasgo vxmsearchableSearchableTrait y adjunte vxmsearchableSearchableBehavior Behavior al registro activo que desea hacer. Esto ayudará a sincronizar el modelo con datos de índice.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}Si bien no se requiere estrictamente para usar esta extensión, debe considerar firmemente la configuración de un yii2-coleue antes de usar una extensión. Ejecutar un trabajador de cola permitirá que coloque todas las operaciones que sincronizan su información de modelo con sus índices de búsqueda, proporcionando tiempos de respuesta mucho mejores para la interfaz web de su aplicación.
Una vez que haya configurado un componente de cola, establezca el valor de la opción de cola en el archivo de configuración de su aplicación en el ID de componente o una configuración de la matriz.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] Por defecto, un componente se agregará a los componentes de su aplicación a través de Bootstrapping con ID searchable . Si necesita configurarlo, puede manual de configuración en el archivo de configuración de su aplicación:
' 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
]
] Cada modelo de registro activo se sincroniza con un index de búsqueda dado, que contiene todos los registros de búsqueda para ese modelo. En otras palabras, puede pensar en cada índice como una tabla MySQL. Por defecto, cada modelo persistirá a un índice que coincida con el nombre típico de la table del modelo. Típicamente, esta es la forma plural del nombre del modelo; Sin embargo, puede personalizar el nombre index anulando el método searchableIndex Static en la clase de modelo de registro activo:
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 ' ;
}
} Por defecto, todo el formulario toArray de un modelo dado se persistirá a su índice de búsqueda. Si desea personalizar los datos que se sincronizan con el índice de búsqueda, puede anular el método toSearchableArray en el modelo:
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 ;
}
} Por defecto, el nombre clave principal del modelo como la ID única almacenada en el índice de búsqueda. Si necesita personalizar este comportamiento, puede anular el método searchableKey Static en el modelo:
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 ' ;
}
}Si está instalando una extensión en un proyecto existente, es posible que ya tenga registros de base de datos que necesita importar a su controlador de búsqueda. Esta extensión proporciona una acción de importación que puede utilizar para importar todos sus registros existentes en sus índices de búsqueda:
php yii searchable/import -- models ="app models Post " Puede importar clases de modelos múltiples por separador ,
php yii searchable/import -- models ="app models Post , app models Category " Una vez que haya agregado el vxmsearchableSearchableTrait y adjuntar el comportamiento vxmsearchableSearchableBehavior a un modelo, todo lo que necesita hacer es guardar una instancia de modelo y se agregará automáticamente a su índice de búsqueda. Si ha configurado la cola, esta operación será realizada en segundo plano por el trabajador de la cola:
$ post = new app models Post ;
// ...
$ post -> save (); Si desea agregar un resultado de la consulta activa a su índice de búsqueda, puede usar el método makeSearchable en un resultado de la consulta activa. El método makeSearchable fragmentará los resultados de la consulta y agregará los registros a su índice de búsqueda. Nuevamente, si ha configurado la cola, los trabajadores de su cola agregarán todos los fragmentos en segundo plano:
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); El método makeSearchable puede considerarse una operación upsert . En otras palabras, si el registro del modelo ya está en su índice, se actualizará. Si no existe en el índice de búsqueda, se agregará al índice.
Para actualizar un modelo de búsqueda, solo necesita actualizar las propiedades de la instancia del modelo y guardar el modelo en su base de datos. Esta extensión persistirá automáticamente los cambios en su índice de búsqueda:
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); También puede usar el método makeSearchable en una clase de registro activo para actualizar la instancia. Si los modelos no existen en su índice de búsqueda, se creará:
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );Para eliminar un registro de su índice, elimine el modelo de la base de datos:
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); Si desea eliminar un resultado de la consulta activa de su índice de búsqueda, puede usar el método deleteSearchable en una clase de registro activo:
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); A veces es posible que deba realizar un lote de operaciones de registro activo en un modelo sin sincronizar los datos del modelo a su índice de búsqueda. Puede hacer esto utilizando el método withoutSyncingToSearch . Este método acepta una sola devolución de llamada que se ejecutará inmediatamente. Cualquier operación del modelo que ocurra dentro de la devolución de llamada no se sincronizará con el índice del modelo:
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); A veces es posible que solo necesite hacer un modelo de búsqueda bajo ciertas condiciones. Por ejemplo, imagine que tiene el modelo appmodelsArticle que puede estar en uno de los dos estados: draft y published . Es posible que solo desee permitir que las publicaciones published se puedan buscar. Para lograr esto, puede definir un método shouldBeSearchable en su modelo:
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 ;
}
} El método shouldBeSearchable solo se aplica al manipular modelos a través del método Guardar. Hacer modelos directamente utilizando el método searchable o makeSearchable anulará el resultado del método 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 ); Puede comenzar a buscar un modelo utilizando el método search . El método de búsqueda acepta una sola cadena que se utilizará para buscar en sus modelos. Este método devuelve un ActiveQuery puede agregar más condición o relación como una consulta de origen.
Tenga en cuenta que cuando agregue más condición de consulta, no debe usarse
whereel método useandWhereoorWherelugar, porque anulará el resultado de la condición de IDS de búsqueda.
$ 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 (); Puede unirse a las relaciones en la consulta de búsqueda con soporte de relaciones searchable :
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); Puede elegir un modo de búsqueda boolean o fuzzy como segundo parámetro si no se establece defaultSearchMode de componente de búsqueda Searchable :
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();Para obtener más detalles sobre el modo de búsqueda, consulte TeamTNT/TNTSearch para ver el documento completo.