Ce package facilite l'utilisation des capacités de recherche de texte intégral PostgreSQL natives avec Laravel Scout.
Si vous trouvez ce package utile, veuillez me considérer par un café.
Vous pouvez installer le package via le compositeur:
composer require pmatseykanets/laravel-scout-postgresSi vous utilisez Laravel <5.5 ou si vous avez un package désactivé automatiquement, vous devez enregistrer manuellement le fournisseur de services:
// config/app.php
' providers ' => [
...
ScoutEngines Postgres PostgresEngineServiceProvider::class,
], Scout Service Provider utilise config_path Helper qui n'est pas inclus dans Lumen. Pour résoudre ce problème, incluez l'extrait suivant soit directement dans bootstrap.app , soit dans votre fichier d'aide à AIDETODED IE app/helpers.php .
if (! function_exists ( ' config_path ' )) {
/**
* Get the configuration path.
*
* @param string $path
* @return string
*/
function config_path ( $ path = '' )
{
return app ()-> basePath () . ' /config ' .( $ path ? DIRECTORY_SEPARATOR . $ path : $ path );
}
} Créez le fichier de configuration scout.php dans le dossier app/config avec le contenu suivant
<?php
return [
' driver ' => env ( ' SCOUT_DRIVER ' , ' pgsql ' ),
' prefix ' => env ( ' SCOUT_PREFIX ' , '' ),
' queue ' => false ,
' pgsql ' => [
' connection ' => ' pgsql ' ,
' maintain_index ' => true ,
' config ' => ' english ' ,
],
];Enregistrer les fournisseurs de services:
// bootstrap/app.php
$ app -> register ( Laravel Scout ScoutServiceProvider::class);
$ app -> configure ( ' scout ' );
$ app -> register ( ScoutEngines Postgres PostgresEngineServiceProvider::class); Spécifiez la connexion de la base de données qui doit être utilisée pour accéder aux documents indexés dans le fichier de configuration de Laravel Scout config/scout.php :
// config/scout.php
. . .
' pgsql ' => [
// Connection to use. See config/database.php
' connection ' => env ( ' DB_CONNECTION ' , ' pgsql ' ),
// You may want to update index documents directly in PostgreSQL (i.e. via triggers).
// In this case you can set this value to false.
' maintain_index ' => true ,
// You can explicitly specify what PostgreSQL text search config to use by scout.
// Use dF in psql to see all available configurations in your database.
' config ' => ' english ' ,
// You may set the default querying method
// Possible values: plainquery, phrasequery, tsquery
// plainquery is used if this option is omitted.
' search_using ' => ' tsquery '
],
... Assurez-vous qu'une configuration de recherche de texte par défaut appropriée est définie Globbaly (dans postgresql.conf ), pour une base de données particulière ( ALTER DATABASE ... SET default_text_search_config TO ... ) ou définissez alternativement default_text_search_config dans chaque session.
Pour vérifier la valeur actuelle
SHOW default_text_search_config; Par défaut, le moteur s'attend à ce que les documents analysés (données du modèle) soient stockés dans le même tableau que le modèle dans une colonne searchable de type tsvector . Vous devez créer cette colonne et un index dans votre schéma. Vous pouvez choisir entre les index GIN et GiST dans PostgreSQL.
class CreatePostsTable extends Migration
{
public function up ()
{
Schema:: create ( ' posts ' , function ( Blueprint $ table ) {
$ table -> increments ( ' id ' );
$ table -> text ( ' title ' );
$ table -> text ( ' content ' )-> nullable ();
$ table -> integer ( ' user_id ' );
$ table -> timestamps ();
});
DB :: statement ( ' ALTER TABLE posts ADD searchable tsvector NULL ' );
DB :: statement ( ' CREATE INDEX posts_searchable_index ON posts USING GIN (searchable) ' );
// Or alternatively
// DB::statement('CREATE INDEX posts_searchable_index ON posts USING GIST (searchable)');
}
public function down ()
{
Schema:: drop ( ' posts ' );
}
}En plus des attributs du modèle, vous pouvez apporter d'autres données d'autres données au document index. C'est-à-dire une liste de balises pour un message.
public function toSearchableArray ()
{
return [
' title ' => $ this -> title ,
' content ' => $ this -> content ,
' author ' => $ this -> user -> name ,
' tags ' => $ this -> tags -> pluck ( ' tag ' )-> implode ( ' ' ),
];
} Vous pouvez affiner le comportement du moteur pour un modèle particulier en mettant en œuvre searchableOptions() dans votre modèle.
class Post extends Model
{
use Searchable;
// ...
public function searchableOptions ()
{
return [
// You may wish to change the default name of the column
// that holds parsed documents
' column ' => ' indexable ' ,
// You may want to store the index outside of the Model table
// In that case let the engine know by setting this parameter to true.
' external ' => true ,
// If you don't want scout to maintain the index for you
// You can turn it off either for a Model or globally
' maintain_index ' => true ,
// Ranking groups that will be assigned to fields
// when document is being parsed.
// Available groups: A, B, C and D.
' rank ' => [
' fields ' => [
' title ' => ' A ' ,
' content ' => ' B ' ,
' author ' => ' D ' ,
' tags ' => ' C ' ,
],
// Ranking weights for searches.
// [D-weight, C-weight, B-weight, A-weight].
// Default [0.1, 0.2, 0.4, 1.0].
' weights ' => [ 0.1 , 0.2 , 0.4 , 1.0 ],
// Ranking function [ts_rank | ts_rank_cd]. Default ts_rank.
' function ' => ' ts_rank_cd ' ,
// Normalization index. Default 0.
' normalization ' => 32 ,
],
// You can explicitly specify a PostgreSQL text search configuration for the model.
// Use dF in psql to see all available configurationsin your database.
' config ' => ' simple ' ,
];
}
}
. . . Si vous décidez de garder l'index de votre modèle en dehors du tableau du modèle, vous pouvez faire savoir au moteur que vous souhaitez pousser des champs supplémentaires dans le tableau d'index que vous pouvez ensuite utiliser pour filtrer le résultat en appliquant where() avec le Scout Builder . Dans ce cas, vous devez implémenter searchableAdditionalArray() sur votre modèle. Bien sûr, le schéma de la table externe doit inclure ces colonnes supplémentaires.
public function searchableAdditionalArray ()
{
return [
' user_id ' => $ this -> user_id ,
];
}Vous voudrez peut-être faire cacher votre colonne consultable pour qu'il ne vous tient pas sur votre chemin
protected $ hidden = [
' searchable ' ,
]; // plainto_tsquery()
$ posts = App Post:: search ( ' cat rat ' )
-> usingPlainQuery ()->get()
// phraseto_tsquery()
$ posts = App Post:: search ( ' cat rat ' )
-> usingPhraseQuery ()->get()
// to_tsquery()
$ posts = App Post:: search ( ' fat & (cat | rat) ' )
-> usingTsQuery ()->get()
// websearch_to_tsquery()
// uses web search syntax
$ posts = App Post:: search ( ' "sad cat" or "fat rat" -mouse ' )
-> usingWebSearchQuery ()->get()
// DIY using a callback
use ScoutEngines Postgres TsQuery ToTsQuery ;
$ results = App Post:: search ( ' fat & (cat | rat) ' , function ( $ builder , $ config ) {
return new ToTsQuery ( $ builder -> query , $ config );
})-> get ();Veuillez consulter la documentation officielle sur la façon d'utiliser Laravel Scout.
composer test Si vous découvrez des problèmes liés à la sécurité, veuillez envoyer un e-mail [email protected] au lieu d'utiliser le tracker du problème.
Veuillez consulter Changelog pour plus d'informations ce qui a changé récemment.
Veuillez consulter la contribution pour plus de détails.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.