Proyek sekolah dari Proyek Pemrograman Kursus 2, Grup 2, Sarjana Profesional "menerapkannya" di Erasmumshogeschool Brussel.
Aplikasi mesin pencari untuk dokumen asuransi. Perusahaan asuransi menyimpan dokumen tentang undang -undang, yurisprudensi dan doktrin hukum di bidang khusus mereka. Tujuannya adalah untuk memberikan karyawan aplikasi mesin pencari yang mudah digunakan berdasarkan algori dari kerangka kerja Elasticsearch.
| Komponen | Versi |
|---|---|
| Linux Ubuntu | |
| Fscrawler | |
| Elasticsearch | 6.8 |
| Elasticsearch-PHP | 6.7 |
| Php | 7.4.10 (CLI) |
| Komposer | 2.0.6 |
| Penginstal Laravel | 4.1.0 |
| Mysql |
CATATAN: FSCRAWLER VXXXX hanya kompatibel dengan Elasticsearch 6.8. Akibatnya, memerlukan paket Elasticsearch-PHP v6.7 di file laravel composer.json Anda
Dokumentasi lengkap dapat ditemukan di sini. Dokumen disimpan dalam repo di bawah /dokumen /, jadi jika Anda melihat kesalahan ketik atau masalah, silakan kirim PR untuk memperbaikinya!
Kami juga menyediakan generator contoh kode untuk PHP menggunakan skrip util/GenerateDocExamples.php . Perintah ini parse file util/alternative_report.spec.json yang dihasilkan dari spesifikasi JSON ini dan menghasilkan contoh php foreach digest nilai. Contoh disimpan dalam format ASCIIDOC di bawah folder docs/examples .
Metode yang disarankan untuk menginstal Elasticsearch-PHP adalah melalui komposer.
Tambahkan elasticsearch/elasticsearch sebagai ketergantungan dalam file composer.json proyek Anda (ubah versi yang sesuai dengan versi Elasticsearch Anda, misalnya untuk ES 7.0):
{
"require" : {
"elasticsearch/elasticsearch" : " ^7.0 "
}
}Unduh dan Instal Composer:
curl -s http://getcomposer.org/installer | phpInstal dependensi Anda:
php composer.phar installMembutuhkan autoloader komposer
Komposer juga menyiapkan file autoload yang mampu secara otomatis semua kelas di salah satu perpustakaan yang diunduh. Untuk menggunakannya, cukup tambahkan baris berikut ke proses bootstrap kode Anda:
<?php
use Elasticsearch ClientBuilder ;
require ' vendor/autoload.php ' ;
$ client = ClientBuilder:: create ()-> build ();Anda dapat mengetahui lebih lanjut tentang cara menginstal komposer, mengkonfigurasi autoloading, dan praktik terbaik lainnya untuk mendefinisikan dependensi di getComposer.org.
Versi 7.0 dari perpustakaan ini membutuhkan setidaknya PHP versi 7.1. Selain itu, itu membutuhkan ekstensi JSON asli untuk menjadi versi 1.3.7 atau lebih tinggi.
| Cabang Elasticsearch-PHP | Versi PHP |
|---|---|
| 7.0 | > = 7.1.0 |
| 6.0 | > = 7.0.0 |
| 5.0 | > = 5.6.6 |
| 2.0 | > = 5.4.0 |
| 0.4, 1.0 | > = 5.3.9 |
Karena Insuraquest menggunakan Laravel Jetstream, termasuk login, pendaftaran, verifikasi email, otentikasi dua faktor dan manajemen sesi di luar kotak. Jetstream menggunakan Laravel Fortify, yang merupakan backend otentikasi agnostik front-end untuk Laravel.
Di file konfigurasi config/fortify.php Anda dapat menyesuaikan berbagai aspek, pilih aspek mana yang ingin Anda terapkan pada proyek Anda dll.
Logika yang akan dieksekusi berdasarkan permintaan otorisasi, dapat ditemukan dan dimodifikasi dalam APP Actions Fortify.
Info dan dokumentasi lebih lanjut di JetStream dapat ditemukan di situs web Jetstream.
Insuraquest mengimplementasikan otorisasi melalui atribut 'tipe' yang termasuk dalam setiap instance pengguna. Ada empat jenis: tamu, pengguna, pustakawan, dan admin. Jenis dibuat cascading. Setiap level baru memiliki izin level di bawah + izin tambahan.
Otorisasi ditegakkan pada berbagai rute (web.php). Pada tampilan campuran, itu juga ditegakkan pada tingkat tampilan dengan menerapkan Laravel asli @can dan @cannot.
Jenis dapat disesuaikan dalam database secara langsung, atau pada halaman 'Administrasi Pengguna' saat Anda masuk dengan AdminAccount.
Ketika pengunjung belum masuk, ia akan dialihkan ke layar login. Secara default - ketika pengguna baru terdaftar - ia ditugaskan jenis 'tamu'. Dia akan dapat melihat HARDINGPAGE dan dokumentasi, tetapi tidak dapat menanyakan dokumen apa pun. Seorang pengguna dapat menanyakan dokumen, membukanya dan mengirimkannya. Pustakawan dapat mengunggah file baru, menghapus file dan mengubah tag di atasnya. Admin dapat melihat semua pengguna, informasi mereka, dan menyesuaikan jenisnya.
Deskripsi pengaturan penempatan.
"external" : {
"properties" : {
"title" : {
"type" : " text "
},
"language" : {
"type" : " keyword "
},
"date_published" : {
"type" : " date "
},
"issuer" : {
"type" : " keyword "
},
"category" : {
"type" : " keyword "
},
"tag" : {
"type" : " keyword "
}
}
}Dianggap lebih kuat daripada server Laravel bawaan.
server {
listen 80 ;
server_name 10.3.50.7 ;
root /var/www/insuraquest_production/insuraquest/public ;
add_header X-Frame-Options " SAMEORIGIN " ;
add_header X-XSS-Protection " 1; mode=block " ;
add_header X-Content-Type-Options " nosniff " ;
index index.php ;
charset utf-8 ;
location / {
try_files $uri $uri / /index.php ? $query_string ;
}
location = /favicon.ico { access_log off ; log_not_found off ; }
location = /robots.txt { access_log off ; log_not_found off ; }
error_page 404 /index.php ;
location ~ . php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock ;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name ;
include fastcgi_params ;
}
location ~ / . ( ? ! well-known). * {
deny all ;
}
}php artisan migrate:fresh --seedgit init --bare /home/student/insuraquest/bare_project.init #! /bin/bash
# check out the files
git --work-tree=/var/www/insuraquest_production --git-dir=/home/student/insuraquest/bare_project.git checkout -f
chmod +x /path/to/bare_project.git/hooks/post-receivegit remote add live ' [email protected]:/home/student/insuraquest/bare_project.git '
git push --set-upstream live maincomposer update chgrp -R www-data insuraquest_productionphp artisan storage:linkDalam Elasticsearch-PHP, hampir semuanya dikonfigurasi oleh array asosiatif. Parameter titik akhir, dokumen, dan opsional - semuanya adalah array asosiatif.
Untuk mengindeks dokumen, kita perlu menentukan tiga bagian informasi: indeks, ID dan badan dokumen. Ini dilakukan dengan membangun array asosiatif kunci: pasangan nilai. Badan permintaan itu sendiri merupakan array asosiatif dengan kunci: pasangan nilai yang sesuai dengan data dalam dokumen Anda:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id ' ,
' body ' => [ ' testField ' => ' abc ' ]
];
$ response = $ client -> index ( $ params );
print_r ( $ response );Respons yang Anda dapatkan kembali menunjukkan dokumen tersebut dibuat dalam indeks yang Anda tentukan. Responsnya adalah array asosiatif yang berisi versi decoded dari JSON yang dikembalikan Elasticsearch:
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[result] => created
[_shards] => Array
(
[total] => 1
[successful] => 1
[failed] => 0
)
[_seq_no] => 0
[_primary_term] => 1
)Mari kita dapatkan dokumen yang baru saja kami indeks. Ini hanya akan mengembalikan dokumen:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> get ( $ params );
print_r ( $ response ); Responsnya berisi beberapa metadata (indeks, versi, dll.) Serta bidang _source , yang merupakan dokumen asli yang Anda kirim ke Elasticsearch.
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[_seq_no] => 0
[_primary_term] => 1
[found] => 1
[_source] => Array
(
[testField] => abc
)
) Jika Anda ingin mengambil bidang _source secara langsung, ada metode getSource :
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ source = $ client -> getSource ( $ params );
print_r ( $ source ); Responsnya hanya akan nilai _source :
Array
(
[testField] => abc
)Pencarian adalah ciri khas Elasticsearch, jadi mari kita lakukan pencarian. Kami akan menggunakan kueri pertandingan sebagai demonstrasi:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' query ' => [
' match ' => [
' testField ' => ' abc '
]
]
]
];
$ response = $ client -> search ( $ params );
print_r ( $ response ); Responsnya sedikit berbeda dari respons sebelumnya. Kami melihat beberapa metadata ( took , timed_out , dll.) Dan sebuah array bernama hits . Ini mewakili hasil pencarian Anda. Di dalam hits adalah array lain bernama hits , yang berisi hasil pencarian individual:
Array
(
[took] => 33
[timed_out] =>
[_shards] => Array
(
[total] => 1
[successful] => 1
[skipped] => 0
[failed] => 0
)
[hits] => Array
(
[total] => Array
(
[value] => 1
[relation] => eq
)
[max_score] => 0.2876821
[hits] => Array
(
[ 0 ] => Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_score] => 0.2876821
[_source] => Array
(
[testField] => abc
)
)
)
)
)Baiklah, mari kita lanjutkan dan hapus dokumen yang kami tambahkan sebelumnya:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> delete ( $ params );
print_r ( $ response ); Anda akan melihat ini adalah sintaksis yang identik dengan sintaks get . Satu -satunya perbedaan adalah operasi: delete alih -alih get . Responsnya akan mengkonfirmasi dokumen itu dihapus:
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 2
[result] => deleted
[_shards] => Array
(
[total] => 1
[successful] => 1
[failed] => 0
)
[_seq_no] => 1
[_primary_term] => 1
)Karena sifat dinamis Elasticsearch, dokumen pertama yang kami tambahkan secara otomatis membangun indeks dengan beberapa pengaturan default. Mari kita hapus indeks itu karena kita ingin menentukan pengaturan kita sendiri nanti:
$ deleteParams = [
' index ' => ' my_index '
];
$ response = $ client -> indices ()-> delete ( $ deleteParams );
print_r ( $ response );Tanggapannya:
Array
(
[acknowledged] => 1
)Sekarang kita mulai segar (tidak ada data atau indeks), mari tambahkan indeks baru dengan beberapa pengaturan khusus:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' settings ' => [
' number_of_shards ' => 2 ,
' number_of_replicas ' => 0
]
]
];
$ response = $ client -> indices ()-> create ( $ params );
print_r ( $ response );Elasticsearch sekarang akan membuat indeks itu dengan pengaturan yang Anda pilih, dan mengembalikan pengakuan:
Array
(
[acknowledged] => 1
) Seorang pustakawan memiliki kemungkinan untuk mengunggah file baru. Saat mengunggah dokumen, dimungkinkan untuk menambahkan tag ke dokumen yang diunggah. Konten untuk tag ditarik dari tabel MySQL dan ditambahkan ke formulir.
FileUploadController.php
$ this ->validate( $ request , [
' title ' => ' required ' ,
' language ' => ' required ' ,
' date ' => ' required|date ' ,
' issuer ' => ' required ' ,
' category ' => ' required ' ,
' tag ' => ' required ' ,
' file ' => ' required|mimes:pdf|max:2048 '
]Ketika sebuah dokumen diunggah, file dan tag diposting ke FSCrawler, yang akan mengindeks dokumen sebelum menambahkan ke simpul Elasticsearch kami.
FileUploadController.php
$ file = $ request -> file ( ' file ' );
$ pathname = $ file -> store ( ' public ' );
$ fully_qualified_pathname = storage_path ( ' app/ ' . $ pathname );
$ client = new Client ();
try {
$ client -> request ( ' POST ' , ' http://127.0.0.1:8080/fscrawler/_upload ' ,
);
} catch ( GuzzleException $ e ) {
echo $ e ;
} Plugin ditambahkan untuk tata letak formulir -> tailwind.config.js
https://tailwindcss-custom-forms.netlify.app/
plugins: [
require ( ' @tailwindcss/custom-forms ' ),
] Setelah pengguna mendapatkan semua hasil pencariannya, ia dapat melihat detail lebih lanjut tentang hasil apa pun.
Di sini ia memiliki kemungkinan untuk mengedit, menghapus atau mengirimkan PDF yang ditampilkan.
File yang dimodifikasi atau dibuat untuk fungsionalitas surat
Perintah menggunakan kelas Markdown Mailavel Laravel yang digunakan untuk membuat email.
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
Pengontrol surat, pada dasarnya kami akan mendefinisikan logika untuk menampilkan daftar pengguna. Jalankan perintah untuk membuat pengontrol.
php artisan make:controller MailController
Kemungkinan untuk menguji fungsi email http: // localhost: 8000/send -email -> mengirim surat ke mailtrap (akun bart)
TODO: Menerapkan fungsionalitas surat ke dalam satu hasil pencarian
use GuzzleHttp Ring Client MockHandler ;
use Elasticsearch ClientBuilder ;
// The connection class requires 'body' to be a file stream handle
// Depending on what kind of request you do, you may need to set more values here
$ handler = new MockHandler ([
' status ' => 200 ,
' transfer_stats ' => [
' total_time ' => 100
],
' body ' => fopen ( ' somefile.json ' ),
' effective_url ' => ' localhost '
]);
$ builder = ClientBuilder:: create ();
$ builder -> setHosts ([ ' somehost ' ]);
$ builder -> setHandler ( $ handler );
$ client = $ builder -> build ();
// Do a request and you'll get back the 'body' response aboveItu hanya ikhtisar kursus klien dan sintaksinya. Jika Anda terbiasa dengan Elasticsearch, Anda akan melihat bahwa metode tersebut disebut seperti titik akhir istirahat.
Anda juga akan melihat bahwa klien dikonfigurasi dengan cara yang memfasilitasi penemuan mudah melalui IDE. Semua tindakan inti tersedia di bawah objek $client (pengindeksan, pencarian, mendapatkan, dll.). Indeks dan manajemen cluster terletak di bawah objek $client->indices() dan $client->cluster() , masing-masing.
Lihat sisa dokumentasi untuk melihat bagaimana seluruh klien bekerja.
Harap dicatat bahwa proyek ini untuk digunakan dalam konteks sekolah. Untuk pengembangan lebih lanjut, silakan hubungi TE
Pengguna dapat memilih lisensi mana yang ingin mereka gunakan. Karena tidak ada bundel yang dapat dieksekusi atau distribusi yang diskriminatif untuk membedakan lisensi, pengguna harus mendokumentasikan pilihan lisensi mereka secara eksternal, jika perpustakaan didistribusikan kembali. Jika tidak ada pilihan eksplisit, asumsi adalah bahwa redistribusi mematuhi aturan kedua lisensi.