Paket ini memudahkan untuk menggunakan kemampuan pencarian teks lengkap PostgreSQL dengan Laravel Scout.
Jika Anda menemukan paket ini berguna, silakan pertimbangkan saya minum kopi.
Anda dapat menginstal paket melalui komposer:
composer require pmatseykanets/laravel-scout-postgresJika Anda menggunakan Laravel <5,5 atau jika Anda memiliki paket penemuan otomatis, Anda harus mendaftarkan penyedia layanan secara manual:
// config/app.php
' providers ' => [
...
ScoutEngines Postgres PostgresEngineServiceProvider::class,
], Penyedia layanan Scout menggunakan helper config_path yang tidak termasuk dalam lumen. Untuk memperbaikinya termasuk cuplikan berikut baik secara langsung di bootstrap.app atau di file pembantu Anda yang dimuat secara otomatis 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 );
}
} Buat file konfigurasi scout.php di folder app/config dengan konten berikut
<?php
return [
' driver ' => env ( ' SCOUT_DRIVER ' , ' pgsql ' ),
' prefix ' => env ( ' SCOUT_PREFIX ' , '' ),
' queue ' => false ,
' pgsql ' => [
' connection ' => ' pgsql ' ,
' maintain_index ' => true ,
' config ' => ' english ' ,
],
];Daftar Penyedia Layanan:
// bootstrap/app.php
$ app -> register ( Laravel Scout ScoutServiceProvider::class);
$ app -> configure ( ' scout ' );
$ app -> register ( ScoutEngines Postgres PostgresEngineServiceProvider::class); Tentukan koneksi database yang harus digunakan untuk mengakses dokumen yang diindeks di file konfigurasi 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 '
],
... Pastikan bahwa konfigurasi pencarian teks default yang sesuai diatur globbaly (di postgresql.conf ), untuk database tertentu ( ALTER DATABASE ... SET default_text_search_config TO ... ) atau alternatif set default_text_search_config di setiap sesi.
Untuk memeriksa nilai saat ini
SHOW default_text_search_config; Secara default, mesin mengharapkan bahwa dokumen yang diuraikan (data model) disimpan dalam tabel yang sama dengan model dalam kolom searchable tipe tsvector . Anda perlu membuat kolom ini dan indeks dalam skema Anda. Anda dapat memilih antara indeks GIN dan GiST di 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 ' );
}
}Selain atribut Model, Anda dapat membawa data lain apa pun ke dokumen indeks. Yaitu daftar tag untuk posting.
public function toSearchableArray ()
{
return [
' title ' => $ this -> title ,
' content ' => $ this -> content ,
' author ' => $ this -> user -> name ,
' tags ' => $ this -> tags -> pluck ( ' tag ' )-> implode ( ' ' ),
];
} Anda dapat menyempurnakan perilaku mesin untuk model tertentu dengan melibatkan searchableOptions() dalam model Anda.
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 ' ,
];
}
}
. . . Jika Anda memutuskan untuk menyimpan indeks model Anda di luar tabel model, Anda dapat memberi tahu mesin bahwa Anda ingin mendorong bidang tambahan di tabel indeks yang kemudian dapat Anda gunakan untuk memfilter hasil yang ditetapkan dengan menerapkan where() dengan Builder Scout. Dalam hal ini Anda harus mengimplementasikan searchableAdditionalArray() pada model Anda. Tentu saja skema untuk tabel eksternal harus menyertakan kolom tambahan ini.
public function searchableAdditionalArray ()
{
return [
' user_id ' => $ this -> user_id ,
];
}Anda mungkin ingin membuat kolom yang dapat dicari tersembunyi sehingga tidak menghalangi jalan Anda
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 ();Silakan lihat dokumentasi resmi tentang cara menggunakan Laravel Scout.
composer test Jika Anda menemukan masalah terkait keamanan, silakan kirim email ke [email protected] alih -alih menggunakan pelacak masalah.
Silakan lihat Changelog untuk informasi lebih lanjut apa yang telah berubah baru -baru ini.
Silakan lihat berkontribusi untuk detailnya.
Lisensi MIT (MIT). Silakan lihat file lisensi untuk informasi lebih lanjut.