Implementasi mesin pencari yang mudah digunakan dalam entitas doktrin.
Untuk penggunaan dasar, yang harus Anda lakukan adalah mendefinisikan peta entitas yang dicari dan propertinya, mesin pencari akan mengatur agar mereka dimuat dengan benar dan secara otomatis akan mengurutkan hasil pencarian berdasarkan kandidat yang ditemukan.
Tujuan dari paket ini adalah untuk menyediakan API sederhana untuk pencarian teks lengkap canggih di entitas doktrin. Pada awal permintaan, skema pencarian dibangun dan paket ini secara otomatis memastikan bahwa hasil terbaik ditemukan dan dikembalikan berdasarkan relevansi.
Untuk menginstal komposer panggilan paket secara manual dan jalankan perintah berikut:
$ composer require baraja-core/doctrine-fulltext-search Dan kemudian mendaftar DoctrineFulltextSearchExtension di Neon Konfigurasi:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension Atau Anda dapat membuat instance BarajaSearchSearch secara manual.
Pencarian dilakukan dengan membangun kueri (entitas pemetaan dan kolom):
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer Atau Anda dapat menggunakan SelectorBuilder dengan validasi tipe penuh dan metode mengisyaratkan untuk membangun kueri:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;Tidak perlu melarikan diri dari output, semua logika diselesaikan oleh mesin secara otomatis.
:username - kolom akan digunakan sebagai keterangan
!slug - kolom akan digunakan untuk mencari, tetapi diabaikan dalam output Perex.
_durationTime - Kolom akan dimuat ke dalam entitas, tetapi tidak akan diperhitungkan saat menghitung relevansi dan tidak akan dimasukkan dalam Perex.
content.versions.haystack - Hubungan antara entitas secara otomatis membuat bergabung dan memuat properti terakhir.
versions(content) - Getter khusus (secara otomatis bergabung dengan kolom versions , tetapi hubungi getContent() untuk mendapatkan data).
Jika kita menggunakan usus besar di awal nama kolom (misalnya ':username' ), itu akan secara otomatis digunakan sebagai judul.
Judul akan ditampilkan meskipun tidak mengandung kata -kata pencarian.
Keterangan mungkin kosong dan mungkin tidak ada (mungkin null ).
Jika judul tidak ada, maka mesin dapat secara otomatis menghitungnya sesuai dengan kejadian terbaik dalam teks yang ditemukan.
Kueri pencarian secara otomatis dinormalisasi dan stopword dihapus, yang tidak masuk akal untuk mencari.
Algoritma ini dapat ditimpa dalam proyek tertentu dengan mengimplementasikan antarmuka IQueryNormalizer dan menimpanya dalam wadah DIC.
Output dari metode search() adalah entitas dari tipe SearchResult , yang mengimplementasikan antarmuka Iterator untuk kemampuan untuk dengan mudah bersepeda melalui hasil.
Kiat: Jika Anda hanya perlu mencetak hasil pencarian dengan cepat dan persyaratan penampilan tidak terlalu tinggi, entitas
SearchResultsecara langsung mengimplementasikan metode__toString()untuk rendering hasil yang mudah secara langsung sebagai HTML.
Hasil pencarian merangkum semua hasil dari semua pencarian di semua entitas. Semua hasil diperoleh dengan metode getItems() - output akan menjadi array entitas dari jenis SearchItem[] .
Namun, kita sering perlu menyusun kueri dalam jumlah besar dan kemudian daftar, misalnya, kategori dan produk secara terpisah. Untuk melakukan ini, gunakan metode helper getItemsOfType(string $type) , yang mengembalikan serangkaian hasil SearchItem[] yang terpotong hanya untuk entitas sesuai dengan parameter yang diteruskan.
Kami menggunakan metode getItems() atau getItemsOfType() untuk mendapatkan hasil pencarian yang kami lalui. Tapi bagaimana cara bekerja dengan hasil tertentu?
Penting untuk dicatat bahwa pada titik ini kita tidak lagi memiliki metode __toString() yang tersedia dan harus membuat hasil (idealnya dalam templat) sendiri.
Untuk kebanyakan kasus, pembantu siap pakai sudah cukup:
getTitle() mengembalikan judul entitas yang ditemukan sebagai string atau nol.getTitleHighlighted() memanggil getTitle() secara internal, dan jika hasilnya adalah string yang valid, itu menodai kejadian setiap kata dengan <i class="highlight"> dan </i> .getSnippet() mengembalikan potongan entitas yang ditemukan, yang merangkum area yang paling ditemukan di entitas asli (misalnya, cuplikan artikel di mana kata -kata pencarian terjadi). Lebih banyak cuplikan dapat dikembalikan (kejadian individu dibagi dengan usus besar). Selalu mengembalikan string (bisa kosong).getTitleHighlighted() panggilan internal getSnippet() dan mewarnai kemunculan setiap kata dengan <i class="highlight"> dan </i> .getScore() mengembalikan relatif (berbeda secara kontekstual sesuai dengan permintaan pencarian dan data yang tersedia di setiap proyek) Evaluasi titik hasil (sesuai dengan parameter ini hasilnya secara otomatis diurutkan).getEntity() mengembalikan entitas asli yang ditemukan yang dihasilkan doktrin secara internal. Pencarian dilakukan dengan menggunakan pemilihan parsial, jadi tidak semua properti dapat selalu tersedia.entityToArray() kembali sebagai array. String secara otomatis dinormalisasi. Kedua metode untuk mendapatkan hasil ( getItems() dan getItemsOfType() ) menerima parameter $limit (default 10 ) dan $offset (default 0 ).
Paging sendiri paling baik diimplementasikan menggunakan pagination nette.
Jumlah total hasil diperoleh dengan metode getCountResults() di atas entitas SearchResult .
Mesin pencari menggunakan PARTIAL untuk memuat entitas basis data dan membungkus entitas yang dihasilkan ke dalam hasil pencarian, sehingga Anda dapat memuatnya kapan saja dengan menelepon ->getEntity() di atas hasil pencarian tertentu.
Jika tidak ada hasil yang dapat ditemukan, atau jumlahnya adalah "kecil" (definisi ditentukan oleh algoritma itu sendiri sesuai dengan analisis proyek tertentu), tip untuk koreksi terbaik dari kueri pencarian mungkin (dan mungkin tidak) tersedia.
Untuk bantuan, hubungi metode getDidYouMean() lebih dari SearchResult . Outputnya adalah string (kueri pencarian yang lebih baik) atau nol.
Koreksi kueri pencarian terbaik diperoleh oleh mesin pencari itu sendiri berdasarkan analisis pencarian lanjutan dalam setiap proyek secara terpisah menggunakan metode pembelajaran mesin . Dengan setiap pencarian, statistik tentang kueri pencarian, jumlah hasil dan sinyal lainnya secara otomatis disimpan dan dianalisis secara retrospektif jika perlu.
Mendapatkan bantuan itu alami dan tidak dapat dengan mudah dipengaruhi. Mesin pencari berusaha untuk objektivitas maksimal dan menawarkan kata -kata pengguna yang mencari orang lain dan mengembalikan sebanyak mungkin hasil yang relevan sesuai dengan konteks saat ini. Secara internal, fungsi matematika yang kompleks digunakan, yang terus kami tingkatkan berdasarkan pengalaman dari semua proyek.
Saat mencari, daftar kandidat untuk hasil pencarian pertama kali dikompilasi. Hasil ini secara individual dilewatkan melalui algoritma evaluasi yang melakukan evaluasi "relatif" otomatis dalam kisaran 0 - 512 (berdasarkan berbagai sinyal seperti kueri pencarian, riwayat pengguna terbaru, bahasa, lokasi fisik, konten dan jenis entitas) (hasilnya selalu int ).
Menurut evaluasi titik, hasilnya secara otomatis diurutkan.
Algoritma penilaian dapat ditimpa dengan mengimplementasikan antarmuka IScoreCalculator dan menimpanya dalam wadah DIC.
baraja-core/doctrine-fulltext-search dilisensikan di bawah lisensi MIT. Lihat file lisensi untuk lebih jelasnya.