Pencarian (daravel_scout)
daravel_scout adalah engine database dari Laravel Scout: pencarian berjalan di
tabel model itu sendiri, tanpa indeks yang harus disinkronkan. Di PostgreSQL dengan
pgvector, atau di MariaDB 11.7 atau lebih baru, paket ini juga bisa mencari
berdasarkan makna.
dart pub add daravel_scout
Mencari#
Tambahkan Searchable ke model dan sebutkan kolom yang dicari. Model baru belum
punya attribute, jadi toSearchableArray harus mencantumkannya, seperti di Scout.
import 'package:daravel_scout/daravel_scout.dart';
final class Post extends Model with Searchable {
// ... definition dan accessor
@override
Map<String, Object?> toSearchableArray() => {'title': null, 'body': null};
@override
List<String> get searchUsingFullText => const ['body'];
@override
List<String> get searchUsingPrefix => const ['title'];
}
final posts = await Scout.search(Post.definition, 'laravel')
.where('published', true)
.take(10)
.get();
Setiap kolom dicocokkan dengan LIKE (ILIKE di PostgreSQL), dan query% untuk
kolom prefix. Query berupa angka juga dicocokkan dengan key. Hasil diurutkan dari
yang terbaru; dengan kolom full text di PostgreSQL, berdasarkan relevansi. whereIn,
whereNotIn, orderBy, first, keys, paginate, dan constrain untuk menambah
query database bekerja seperti di Scout.
searchUsingFullText adalah #[SearchUsingFullText] di Scout: tsvector di
PostgreSQL dan MATCH di MySQL atau MariaDB. fullTextOptions mengatur language
dan mode. SQLite tidak punya full text search, jadi kolom full text melempar error
di sana.
Mencari berdasarkan makna#
Tentukan kolom vector dan apa yang di-embed, lalu berikan Scout fungsi yang mengubah
teks menjadi vector. Scout memakai laravel/ai untuk itu; di sini Anda yang
memasangnya.
@override
String? get searchableEmbeddingColumn => 'embedding';
@override
Object? toSearchableEmbedding() => body; // atau List<num> yang sudah ada
Scout.embedder = (texts) => myEmbeddingService.embed(texts);
await Scout.makeSearchable(posts); // menulis vector-nya
final similar = await Scout.search(Post.definition, 'deploying apps')
.semantic(0.7)
.get();
final both = await Scout.search(Post.definition, 'deploying apps')
.hybrid(textWeight: 1, semanticWeight: 2)
.get();
semantic menyisakan baris yang setidaknya semirip itu (default 0,6), yang terdekat
lebih dulu. hybrid menggabungkan peringkat teks dan makna dengan reciprocal rank
fusion, seperti Scout. Keduanya tidak bisa digabung dengan orderBy. Kolomnya
berasal dari table.vector (Database); di SQLite
keduanya melempar error.
Padanan Laravel#
Bagian lain dari Laravel yang ikut didukung, beserta API yang bisa dicari di pub.dev.
| Laravel | Daravel | API | Catatan |
|---|---|---|---|
use Searchable; public function toSearchableArray() |
with Searchable; toSearchableArray() |
Searchable.toSearchableArray |
Hanya engine database. |
#[SearchUsingFullText(['body'])] |
List<String> get searchUsingFullText => ['body'] |
Searchable.searchUsingFullText |