Carian teks penuh Pengakap
- Beratur
- Keperluan Pemandu
- Konfigurasikan indeks model Konfigurasikan ID model
- Indeks
- Padam rekod
- Jeda indeks . Enjin carian tersuai
- Enjin tersuai
- Daftar enjin
- Jana arahan makro
- Pengakap Laravel ation Konfigurasikan indeks model
- Konfigurasikan data yang boleh dicari
- Konfigurasikan ID modelBatch import
- Tambah rekod Cari Enjin tersuai
- Makro Penjana
- Pengenalan Laravel Scout menyediakan penyelesaian berasaskan pemandu mudah untuk carian teks penuh model Eloquent. Dengan menggunakan pemerhati model, Scout menyegerakkan indeks carian rekod Eloquent secara automatik.
- Pada masa ini, Scout datang dengan pemandu Algolia . Walau bagaimanapun, menulis pemacu tersuai juga mudah, dan anda boleh melanjutkan Scout dengan mudah dengan pelaksanaan carian anda sendiri.
- Pemasangan
Mula-mula, pasang Scout melalui pengurus pakej Composer: composer require laravel/scout
Scout Selepas pemasangan selesai, gunakanvendor:publish
arahan konfigurasi Artisan untuk menjana fail. Perintah ini akan menghasilkan fail konfigurasiscout.php
dalam direktoriconfig
anda.php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
- Akhir sekali, tambahkan sifat
<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; }
queue
Walaupun tidak diwajibkan untuk menggunakan Scout, sebelum menggunakan pustaka ini, adalah sangat disyorkan agar anda mengkonfigurasi pemacu baris gilir dan menggunakannya untuk menjalankan baris gilir untuk mengendalikan semua operasi yang membolehkan Scout menyegerakkan maklumat model dengan carian indeks untuk anda Antara muka web aplikasi memberikan respons yang lebih pantas. Sebaik sahaja anda telah mengkonfigurasi pemacu baris gilir, nilai pilihan 'queue' => true,
Syarat yang diperlukan pemandu
Algolia
Apabila menggunakan pemacu Algolia, anda perlu mengkonfigurasi
id
danrahsia< Algolia anda dalam
config/scout.php
fail konfigurasi /kod> Bukti kelayakan. Selepas mengkonfigurasi bukti kelayakan, anda juga perlu menggunakan pengurus pakej Komposer untuk memasang SDK PHP Algolia:config/scout.php
配置文件配置你的 Algoliaid
和secret
凭证。配置好凭证之后,还需要使用 Composer 包管理器安装 Algolia PHP SDK:composer require algolia/algoliasearch-client-php:^2.2
配置
配置模型索引
每个 Eloquent 模型都是通过给定的 「索引」 进行同步,该 「索引」 包含所有可搜索的模型记录。换句话说,你可以把每一个 「索引」 设想为一张 MySQL 数据表。默认情况下,每个模型都会被持久化到与模型的 「表」 名(通常是模型名称的复数形式)相匹配的索引。你也可以通过重写模型上的
searchableAs
方法来自定义模型的索引:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; /** * 获取索引名称 * * @return string */ public function searchableAs() { return 'posts_index'; } }
配置可搜索数据
默认情况下,模型以完整的
toArray
格式持久化到搜索索引。如果要自定义同步到搜索索引的数据,可以覆盖模型上的toSearchableArray
方法:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class Post extends Model{ use Searchable; /** * 获取模型的可搜索数据 * * @return array */ public function toSearchableArray() { $array = $this->toArray(); // Customize array... return $array; } }
配置模型 ID
默认情况下,Scout 将使用模型的主键作为搜索索引中存储的唯一 ID 。 可以通过模型上的
getScoutKey
方法自定义:<?php namespace App; use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Model; class User extends Model{ use Searchable; /** * 获取模型主键 * * @return mixed */ public function getScoutKey() { return $this->email; } }
索引
批量导入
如果你想安装 Scout 到已存在的项目中,你可能已经有了想要导入搜索驱动的数据库记录。Scout 提供了 Artisan 命令
import
用来导入所有已存在的记录到搜索索引:php artisan scout:import "App\Post"
flush
命令可用于从搜索索引中删除所有模型的记录:php artisan scout:flush "App\Post"
添加记录
当你将
LaravelScoutSearchable trait
添加到模型中,你需要做的就是save
$order = new App\Order;// ...$order->save();
Konfigurasi
🎜🎜Mengkonfigurasi indeks model🎜🎜Setiap model Eloquent diberikan dengan Segerakkan "indeks" yang mengandungi semua rekod model yang boleh dicari. Dengan kata lain, anda boleh menganggap setiap "indeks" sebagai jadual data MySQL. Secara lalai, setiap model dikekalkan kepada indeks yang sepadan dengan nama "jadual" model (biasanya bentuk jamak bagi nama model). Anda juga boleh menyesuaikan indeks model dengan mengatasi kaedahsearchableAs
pada model: 🎜// 通过 Eloquent 查询构造器增加.. App\Order::where('price', '>', 100)->searchable(); // 你也可以通过模型关系增加记录... $user->orders()->searchable(); // 你也可以通过集合增加记录... $orders->searchable();
🎜🎜🎜🎜🎜Mengkonfigurasi data boleh carian🎜🎜Secara lalai, model dikekalkan ke indeks carian dalam format penuhtoArray
. Jika anda ingin menyesuaikan data yang disegerakkan ke indeks carian, anda boleh mengatasi kaedahtoSearchableArray
pada model: 🎜$order = App\Order::find(1); // 更新订单... $order->save();
🎜🎜🎜< div name=" 8c2464" data-unique="8c2464">🎜🎜Mengkonfigurasi ID model🎜🎜Secara lalai, Scout akan menggunakan kunci utama model sebagai ID unik yang disimpan dalam indeks carian. Boleh disesuaikan melalui kaedahgetScoutKey
pada model: 🎜// 通过 Eloquent 查询更新... App\Order::where('price', '>', 100)->searchable(); // 你也可以通过数据间的关联进行更新... $user->orders()->searchable(); // 你也可以通过数据集合进行更新... $orders->searchable();
🎜🎜🎜🎜indeks
🎜🎜🎜🎜🎜Batch import🎜🎜Jika anda ingin memasang Scout ke dalam projek sedia ada, Anda mungkin sudah mempunyai rekod pangkalan data yang ingin anda import ke dalam pemacu carian. Scout menyediakan perintah Artisanimport
untuk mengimport semua rekod sedia ada ke dalam indeks carian: 🎜$order = App\Order::find(1); $order->delete();
🎜 Perintahflush
boleh digunakan untuk memadam semua rekod model daripada indeks carian: 🎜// 通过 Eloquent 查询删除... App\Order::where('price', '>', 100)->unsearchable(); // 你可以通过数据间的关系进行删除... $user->orders()->unsearchable(); // 你可以通过数据集合进行删除... $orders->unsearchable();
🎜🎜🎜🎜🎜Menambah rekod🎜🎜Apabila anda menambahsifat LaravelScoutSearchable anda model , semua yang anda perlu lakukan ialah simpan
contoh model dan ia akan ditambahkan secara automatik pada indeks carian. Jika anda telah mengkonfigurasi Scout untuk 🎜menggunakan baris gilir🎜, maka operasi ini akan dilakukan di latar belakang oleh proses pekerja baris gilir anda: 🎜App\Order::withoutSyncingToSearch(function () { // 执行模型操作... });
🎜🎜Menambah melalui Pertanyaan
Jika anda ingin menambah koleksi model pada indeks carian melalui pembina pertanyaan Eloquent, anda juga boleh merantai kaedah
boleh dicari pada pembina pertanyaan Eloquent. boleh dicari
akan memotong hasil pertanyaan pembina dan menambah rekod pada indeks carian anda. Begitu juga, jika anda telah mengkonfigurasi Scout untuk menggunakan baris gilir, semua blok data akan ditambahkan di latar belakang oleh proses pekerja baris gilir anda:searchable
方法。searchable
会把构造器的查询 结果分块 并且将记录添加到你的搜索索引里。同样的,如果你已经配置 Scout 为使用队列,则所有的数据块将在后台由你的队列工作进程添加:public function shouldBeSearchable(){ return $this->isPublished(); }
searchable
方法可以被看做是「更新插入」的操作。换句话说,如果模型记录已经在你的索引里了,它就会被更新。如果搜索索引中不存在,则将其添加到索引中。更新记录
要更新可搜索的模型,只需要更新模型实例的属性并将模型
save
到数据库。Scout 会自动将更新同步到你的搜索索引中:// 此处将遵循 "shouldBeSearchable" 结果... App\Order::where('price', '>', 100)->searchable(); $user->orders()->searchable();$order->save(); // 此处将覆盖 "shouldBeSearchable" 结果... $orders->searchable(); $order->searchable();
你也可以在 Eloquent 查询语句上使用
searchable
方法来更新一个模型的集合。如果这个模型不存在你检索的索引里,就会被创建:$orders = App\Order::search('Star Trek')->get();
删除记录
使用
delete
从数据库中删除该模型就可以移除索引里的记录。这种删除形式甚至与 软删除 的模型兼容:use Illuminate\Http\Request; Route::get('/search', function (Request $request) { return App\Order::search($request->search)->get(); });
如果你不希望记录在删除之前被检索到,可以在 Eloquent 查询实例或集合上使用
unsearchable
方法:$orders = App\Order::search('Star Trek')->raw();
暂停索引
你可能需要在执行一批 Eloquent 操作的时候,不同步模型数据到搜索索引。此时你可以使用
withoutSyncingToSearch
方法来执行此操作。这个方法接受一个立即执行的回调。该回调中所有的操作都不会同步到模型的索引:$orders = App\Order::search('Star Trek') ->within('tv_shows_popularity_desc') ->get();
有条件的搜索模型实例
有时候你可能需要在某些条件下模型是可搜索的。例如,假设你有
AppPost
模型可能两种状态之一:「草稿」和「发布」。你可能只允许搜索 「发布」过的帖子。为了实现这一点,你需要在模型中定义一个shouldBeSearchable
方法:$orders = App\Order::search('Star Trek')->where('user_id', 1)->get();
只有在通过
save
方法、查询或关联模型操作时,才应使用shouldBeSearchable
方法。直接使用searchable
方法将使模型或集合的可搜索结果覆盖shouldBeSearchable
$orders = App\Order::search('Star Trek')->paginate();
Kaedahboleh dicari boleh dianggap sebagai "kemas kini sisipan" beroperasi. Dalam erti kata lain, jika rekod model sudah ada dalam indeks anda, ia akan dikemas kini. Jika ia tidak wujud dalam indeks carian, ia akan ditambahkan pada indeks. Untuk mengemas kini model yang boleh dicari, cuma kemas kini Sifat contoh model danMengemas kini rekod
simpan
model ke pangkalan data. Scout akan menyegerakkan kemas kini secara automatik pada indeks carian anda: 🎜$orders = App\Order::search('Star Trek')->paginate(15);
🎜 Anda juga boleh menggunakan kaedahboleh dicari
pada pertanyaan Eloquent untuk mengemas kini koleksi model. Jika model tidak wujud dalam indeks yang anda cari, ia akan dibuat: 🎜<div class="container"> @foreach ($orders as $order) {{ $order->price }} @endforeach </div> {{ $orders->links() }}
🎜🎜🎜🎜Padam rekod
🎜Gunakanpadam untuk memadam model daripada pangkalan data untuk mengalih keluar rekod dalam indeks. Bentuk pemadaman ini malah serasi dengan model pemadaman lembut: 🎜 'soft_delete' => true,
🎜 Jika anda tidak mahu rekod diambil sebelum pemadaman, anda boleh menggunakan kaedahunsearchable
pada contoh atau koleksi pertanyaan Eloquent : 🎜// 搜索结果包括已删除的记录... $orders = App\Order::withTrashed()->search('Star Trek')->get(); // 搜索结果只含已删除的记录... $orders = App\Order::onlyTrashed()->search('Star Trek')->get();
🎜< a name="pausing-indexing">🎜🎜🎜Menjeda pengindeksan
🎜Anda mungkin perlu melakukan sekumpulan Operasi fasih tanpa Segerakkan data model ke indeks carian. Pada ketika ini anda boleh menggunakan kaedahtanpaSyncingToSearch
untuk melakukan ini. Kaedah ini menerima panggilan balik yang dilaksanakan serta-merta. Semua operasi dalam panggil balik ini tidak akan disegerakkan ke indeks model: 🎜use Algolia\AlgoliaSearch\SearchIndex; App\Order::search('Star Trek', function (SearchIndex $algolia, string $query, array $options) { $options['body']['query']['bool']['filter']['geo_distance'] = [ 'distance' => '1000km', 'location' => ['lat' => 36, 'lon' => 111], ]; return $algolia->search($query, $options); })->get();
🎜🎜🎜🎜 < h3>Instance model carian bersyarat🎜Kadangkala anda mungkin memerlukan model untuk dicari dalam keadaan tertentu. Sebagai contoh, katakan anda mempunyai modelAppPost
yang boleh berada dalam salah satu daripada dua keadaan: "Draf" atau "Diterbitkan". Anda hanya boleh membenarkan carian untuk siaran "diterbitkan". Untuk mencapai matlamat ini, anda perlu mentakrifkan kaedahshouldBeSearchable
dalam model anda: 🎜use Laravel\Scout\Builder; abstract public function update($models); abstract public function delete($models); abstract public function search(Builder $builder); abstract public function paginate(Builder $builder, $perPage, $page); abstract public function mapIds($results); abstract public function map($results, $model); abstract public function getTotalCount($results); abstract public function flush($model);
🎜save, pertanyaan atau model yang berkaitan kaedah >shouldBeSearchable. Menggunakan kaedah boleh dicari
secara langsung akan menyebabkan model atau hasil carian koleksi untuk mengatasi hasil kaedahshouldBeSearchable
: 🎜use Laravel\Scout\EngineManager; /** * 启动任何的服务 * * @return void */ public function boot(){ resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; }); }
🎜🎜🎜🎜🎜🎜Cari
Anda boleh menggunakan kaedah
carian untuk mencari model. Kaedah carian menerima rentetan untuk mencari model. Anda juga perlu merantai kaedah get
pada pertanyaan carian untuk membuat pertanyaan bagi memadankan model Eloquent dengan pernyataan carian yang diberikan:search
方法来搜索模型。search 方法接受一个用于搜索模型的字符串。你还需要在搜索查询上链式调用get
方法,才能用给定的搜索语句查询与之匹配的 Eloquent 模型:'driver' => 'mysql',
Scout 搜索返回 Eloquent 模型的集合,因此你可以直接从路由或控制器返回结果,它们会被自动转换成 JSON 格式:
<?php namespace App\Providers; use Laravel\Scout\Builder; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Response; class ScoutMacroServiceProvider extends ServiceProvider{ /** * 注册应用的Scout 宏命令. * * @return void */ public function boot() { Builder::macro('count', function () { return $this->engine->getTotalCount( $this->engine()->search($this) ); }); } }
如果你想在它们返回 Eloquent 模型前得到原结果,你应该使用
raw
方法:App\Order::search('Star Trek')->count();
搜索查询通常会在模型的
rrreeesearchableAs
方法指定的索引上执行。当然,你也可以使用within
方法指定应该搜索的自定义索引:Where 语句
允许你在搜索查询中增加简单的 "where" 语句。目前,这些语句只支持基本的数值等式检查,并且主要是用于根据租户 ID 进行的范围搜索查询。由于搜索索引不是关系型数据库,因此当前不支持更高级的 "where" 语句:
rrreee分页
除了检索模型的集合,你也可以使用
rrreeepaginate
方法对搜索结果进行分页。这个方法会返回一个就像 传统的 Eloquent 查询分页 一样的Paginator
实例:你可以通过将数量作为第一个参数传递给
rrreeepaginate
方法来指定每页检索多少个模型:获取到检索结果后,就可以使用 Blade 来渲染分页链接和显示检索结果,就像传统的 Eloquent 查询分页一样:
rrreee软删除
如果你的索引模型是 软删除 ,并且你需要搜索软删除的模型,设置
rrreeeconfig/scout.php
配置文件的soft_delete
选项的值为true
:当这个配置选项是
rrreeetrue
的时候, Scout 不会从搜索索引中移除软删除模型。相反,它会在索引记录中设置一个隐藏__soft_deleted
属性。 然后,在搜索的时候,你可以使用withTrashed
或onlyTrashed
方法检索软删除记录:
rrreee{提示} 要永久删除模型可以使用
Scout search mengembalikan koleksi model Eloquent, jadi anda boleh terus Apabila keputusannya dikembalikan daripada laluan atau pengawal, ia secara automatik ditukar kepada format JSON:forceDelete
rrreeeJika anda ingin mendapatkan hasil asal sebelum ia dikembalikan kepada model Eloquent, anda harus menggunakan kaedah
model. Sudah tentu, anda juga boleh menggunakan kaedahraw
: rrreeePertanyaan Carian biasanya dilaksanakan pada indeks yang ditentukan oleh kaedahsearchableAs
dalam
untuk menentukan indeks tersuai yang harus dicari:rrreee🎜🎜🎜Pernyataan Where
🎜 membolehkan anda menambah pernyataan "where" ringkas pada pertanyaan carian. Pada masa ini, pernyataan ini hanya menyokong semakan kesamaan berangka asas dan bertujuan terutamanya untuk pertanyaan carian julat berdasarkan ID penyewa. Oleh kerana indeks carian bukan pangkalan data hubungan, pernyataan "di mana" yang lebih maju tidak disokong pada masa ini: 🎜rrreee🎜🎜🎜🎜< h3>Paginate🎜Selain mendapatkan semula koleksi model, anda juga boleh menggunakan kaedahpaginate
untuk menomborkan hasil carian. Kaedah ini mengembalikan contohPaginator
sama seperti penomboran pertanyaan Eloquent tradisional: 🎜rrreee🎜Anda boleh menentukan kuantiti dengan menghantarnya sebagai hujah pertama kepada kaedahhalaman
Berapa banyak model untuk dapatkan setiap halaman: 🎜rrreee🎜Selepas memperoleh hasil carian, anda boleh menggunakan Blade untuk memaparkan pautan halaman dan memaparkan hasil carian, sama seperti halaman pertanyaan Eloquent tradisional: 🎜rrreee🎜🎜🎜🎜Pemadaman Lembut
🎜Jika model indeks anda dipadamkan lembut dan anda perlu mencari model yang dipadam lembut, tetapkanconfig/scout.php
Nilai pilihansoft_delete
dalam fail konfigurasi adalahtrue
: 🎜rrreee🎜Apabila pilihan konfigurasi initrue
Scout tidak alih keluar model yang dipadam lembut daripada indeks carian. Sebaliknya, ia menetapkan atribut__soft_deleted
tersembunyi pada rekod indeks. Kemudian, apabila mencari, anda boleh menggunakan kaedahwithTrashed
atauonlyTrashed
untuk mendapatkan semula rekod yang dipadam lembut: 🎜rrreee🎜{Tip} Untuk memadamkan model secara kekal, gunakan < kod >forceDelete untuk memadam, Scout akan mengalih keluar model secara automatik daripada indeks carian. 🎜🎜🎜🎜🎜🎜🎜🎜
Enjin carian tersuai
Jika anda perlu menyesuaikan gelagat carian enjin, anda boleh menghantar panggilan balik sebagai parameter kedua kepada kaedah
rrreeesearch
. Sebagai contoh, anda boleh menggunakan panggil balik ini untuk menambah data geolokasi pada permintaan carian sebelum menghantarnya kepada Algolia:search
方法。例如,在将搜索查询传递给 Algolia 之前,可以使用这个回调将地理位置数据添加到搜索请求中:自定义引擎
写引擎
如果内置的 Scout 搜索引擎不能满足你的需求,你可以编写自定义的引擎并且将它注册到 Scout。你的引擎需要继承
rrreeeLaravelScoutEnginesEngine
抽象类,这个抽象类包含了你自定义的引擎必须要实现的七个方法:在
LaravelScoutEnginesAlgoliaEngine
类里查看这些方法的实现会对你有较大的帮助。这个类会为你在学习如何在自定义引擎中实现这些方法提供一个好的起点。注册引擎
一旦你写好了自定义引擎,你可以用 Scout 引擎管理的
rrreeeextend
方法将它注册到 Scout。你只需要从AppServiceProvider
下的boot
方法或者应用中使用的任何一个服务提供器中调用extend
方法。举个例子,如果你写好了一个MySqlSearchEngine
,你可以像这样去注册它:引擎注册后,你可以在
rrreeeconfig/scout.php
配置文件中指定它为默认的 Scoutdriver
:生成宏命令
如果你想要自定义生成器方法,你可以使用
rrreeeLaravelScoutBuilder
类下的macro
方法。通常,定义 "macros" 时, 需要实现 service provider'sboot
方法:macro
函数接受一个名字作为第一个参数,第二个参数为一个闭包函数。当
调用LaravelScoutBuilder
rrreeeJika enjin carian Scout terbina dalam tidak dapat memuaskan Bergantung pada keperluan anda, anda boleh menulis enjin tersuai dan mendaftarkannya dengan Scout. Enjin anda perlu mewarisi kelas abstrakEnjin tersuai
Enjin tulis
LaravelScoutEnginesEngine
Kelas abstrak ini mengandungi tujuh kaedah yang mesti dilaksanakan oleh enjin tersuai anda: 🎜rrreee🎜Lihat ini dalam kelasLaravelScoutEnginesAlgolia
Pelaksanaan bagi. kaedah akan sangat membantu anda. Kelas ini akan memberi anda titik permulaan yang baik untuk mempelajari cara melaksanakan kaedah ini dalam enjin tersuai. 🎜🎜Daftar Enjin
🎜Setelah anda menulis enjin tersuai anda, anda boleh menggunakan enjin Pengakap untuk menguruslanjutkan
kaedah untuk mendaftarkannya dengan Scout. Anda hanya perlu memanggil kaedahlanjutkan
daripada kaedahboot
di bawahAppServiceProvider
atau mana-mana pembekal perkhidmatan yang digunakan dalam aplikasi. Sebagai contoh, jika anda telah menulisMySqlSearchEngine
, anda boleh mendaftarkannya seperti ini: 🎜rrreee🎜Selepas enjin didaftarkan, anda boleh mengkonfigurasinya dalamconfig/scout.php
Tentukan ia sebagaipemandu Pengakap lalai dalam fail: 🎜rrreee🎜🎜🎜 🎜< h2 >Jana perintah makro🎜Jika anda ingin menyesuaikan kaedah penjana, anda boleh menggunakan kaedahmakro
di bawah kelasLaravelScoutBuilder
. Biasanya, apabila mentakrifkan "makro", anda perlu melaksanakan kaedahboot
pembekal perkhidmatan: 🎜rrreee🎜makro
Fungsi menerima nama sebagai parameter pertama dan parameter kedua ialah fungsi pakej penutupan. Fungsi ini dipanggil apabila
memanggil perintah makroLaravelScoutBuilder
.🎜rrreee🎜Artikel ini pertama kali diterbitkan di tapak web 🎜LearnKu.com🎜. 🎜🎜Laman web PHP Cina
LaravelScoutSearchable
pada model yang anda ingin cari. Ciri ini akan mendaftarkan pemerhati model untuk memastikan model dan semua pemacu sentiasa segerak:queue
dalam fail konfigurasiconfig/scout.php
anda hendaklah ditetapkan kepadatrue
: