Uma extensão fornece uma pesquisa simples de texto completo com idéias obtém de Laravel/Scout e base no wrapper TeamTNT/TNTSearch para o Yii2 Active Record.
Requer yii2 pesquisável usando o compositor:
composer require vxm/yii2-searchable Por fim, adicione o traço vxmsearchableSearchableTrait e anexe o comportamento vxmsearchableSearchableBehavior ao registro ativo que você gostaria de tornar pesquisável. Isso ajudará a sincronizar o modelo com dados de índice.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}Embora não seja estritamente necessário usar essa extensão, considere fortemente a configuração de um YII2-QUUE antes de usar uma extensão. A execução de um trabalhador da fila permitirá fila de todas as operações que sincronizem as informações do seu modelo com seus índices de pesquisa, fornecendo tempos de resposta muito melhores para a interface da web do seu aplicativo.
Depois de configurar um componente de fila, defina o valor da opção de fila no seu arquivo de configuração do aplicativo como ID do componente ou uma configuração de matriz.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] Por padrão, um componente será adicionado aos seus componentes de aplicativo via bootstrapping com o ID searchable . Se você precisar configurá -lo, poderá configurar manual no arquivo de configuração do aplicativo:
' 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 ativo é sincronizado com um determinado index de pesquisa, que contém todos os registros pesquisáveis para esse modelo. Em outras palavras, você pode pensar em cada índice como uma tabela MySQL. Por padrão, cada modelo será persistido para um índice que corresponda ao nome da table típico do modelo. Normalmente, essa é a forma plural do nome do modelo; No entanto, você é livre para personalizar o nome index , substituindo o método estático searchableIndex na classe de modelo de registro ativo:
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 padrão, toda a toArray de um determinado modelo será persistida em seu índice de pesquisa. Se você deseja personalizar os dados sincronizados com o índice de pesquisa, você pode substituir o método toSearchableArray no 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 padrão, o nome principal do modelo como o ID exclusivo armazenado no índice de pesquisa. Se você precisar personalizar esse comportamento, poderá substituir o método estático searchableKey no 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 ' ;
}
}Se você estiver instalando uma extensão em um projeto existente, já poderá ter registros de banco de dados que precisará importar para o driver de pesquisa. Esta extensão fornece uma ação de importação que você pode usar para importar todos os registros existentes para seus índices de pesquisa:
php yii searchable/import -- models ="app models Post " Você pode importar classes multi -modelos por separador ,
php yii searchable/import -- models ="app models Post , app models Category " Depois de adicionar o vxmsearchableSearchableTrait e anexar o comportamento vxmsearchableSearchableBehavior a um modelo, tudo o que você precisa fazer é salvar uma instância de modelo e ele será adicionado automaticamente ao seu índice de pesquisa. Se você configurou a fila, esta operação será realizada em segundo plano pelo seu trabalhador da fila:
$ post = new app models Post ;
// ...
$ post -> save (); Se você deseja adicionar resultados de consulta ativa ao seu índice de pesquisa, poderá usar o método makeSearchable em um resultado de consulta ativo. O método makeSearchable será reduzido os resultados da consulta e adicionará os registros ao seu índice de pesquisa. Novamente, se você configurou a fila, todos os pedaços serão adicionados em segundo plano pelos trabalhadores da sua fila:
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); O método makeSearchable pode ser considerado uma operação upsert . Em outras palavras, se o registro do modelo já estiver no seu índice, ele será atualizado. Se não existir no índice de pesquisa, será adicionado ao índice.
Para atualizar um modelo pesquisável, você só precisa atualizar as propriedades da instância do modelo e salvar o modelo no seu banco de dados. Esta extensão persistirá automaticamente as alterações no seu índice de pesquisa:
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); Você também pode usar o método makeSearchable em uma classe de registro ativa para atualizar a instância. Se os modelos não existirem em seu índice de pesquisa, eles serão criados:
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );Para excluir um registro do seu índice, exclua o modelo do banco de dados:
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); Se você deseja excluir um resultado de consulta ativa do seu índice de pesquisa, você pode usar o método deleteSearchable em uma classe de registro ativo:
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); Às vezes, pode ser necessário executar um lote de operações de registro ativo em um modelo sem sincronizar os dados do modelo com o seu índice de pesquisa. Você pode fazer isso usando o método withoutSyncingToSearch . Este método aceita um único retorno de chamada que será executado imediatamente. Quaisquer operações de modelo que ocorram dentro do retorno de chamada não serão sincronizadas com o índice do modelo:
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); Às vezes, pode ser necessário tornar apenas um modelo pesquisável sob determinadas condições. Por exemplo, imagine que você tenha um modelo appmodelsArticle que pode estar em um dos dois estados: draft e published . Você pode apenas permitir que as postagens published sejam pesquisáveis. Para conseguir isso, você pode definir um método shouldBeSearchable em seu 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 ;
}
} O método shouldBeSearchable é aplicado apenas ao manipular modelos através do método de salvamento. Fazer modelos diretamente usando o método searchable ou makeSearchable substituirá o resultado do 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 ); Você pode começar a pesquisar um modelo usando o método search . O método de pesquisa aceita uma única sequência que será usada para pesquisar seus modelos. Este método retorna um ActiveQuery , você pode adicionar mais condições ou relacionamento como uma consulta de origem.
NOTA Quando adicione mais condição de consulta Você não deve ser usado
whereo uso do métodoandWhereos lugares ouorWherelugar nenhum, pois substituirá o resultado da condição de IDs de pesquisa.
$ 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 (); Você pode ingressar em relações na consulta de pesquisa com o suporte de relações searchable :
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); Você pode escolher um modo de pesquisa boolean ou fuzzy como um segundo parâmetro, se não for definido, defaultSearchMode do componente Searchable será usado:
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();Para obter mais detalhes do modo de pesquisa, consulte o TeamTNT/TNTSearch para ver o documento completo.