โครงการโรงเรียนจากโครงการการเขียนโปรแกรมหลักสูตร 2, กลุ่ม 2, ปริญญาตรีมืออาชีพ "สมัครมัน" ที่ Erasmumshogeschool Brussel
แอปพลิเคชันเครื่องมือค้นหาสำหรับเอกสารประกันภัย บริษัท ประกันภัยจัดเก็บเอกสารเกี่ยวกับกฎหมายนิติศาสตร์และหลักคำสอนทางกฎหมายในสาขาเฉพาะของพวกเขา เป้าหมายคือเพื่อให้พนักงานมีแอปพลิเคชันเครื่องมือค้นหาที่ใช้งานง่ายโดยใช้ Algorythms ของเฟรมเวิร์ก Elasticsearch
| ส่วนประกอบ | รุ่น |
|---|---|
| Linux Ubuntu | |
| fscrawler | |
| Elasticsearch | 6.8 |
| Elasticsearch-Php | 6.7 |
| PHP | 7.4.10 (CLI) |
| นักแต่งเพลง | 2.0.6 |
| ตัวติดตั้ง Laravel | 4.1.0 |
| mysql |
หมายเหตุ: fscrawler vxxxx เข้ากันได้กับ Elasticsearch 6.8 เท่านั้น ดังนั้นต้องใช้แพ็คเกจ Elasticsearch-Php v6.7 ในไฟล์ laravel ของคุณ
เอกสารฉบับเต็มสามารถพบได้ที่นี่ เอกสารจะถูกเก็บไว้ภายใน repo under /docs /ดังนั้นหากคุณเห็นการพิมพ์ผิดหรือปัญหาโปรดส่ง PR เพื่อแก้ไข!
นอกจากนี้เรายังมีตัวสร้างตัวอย่างโค้ดสำหรับ PHP โดยใช้สคริปต์ util/GenerateDocExamples.php คำสั่งนี้แยกวิเคราะห์ไฟล์ util/alternative_report.spec.json ที่ผลิตจากข้อกำหนด JSON นี้และสร้างตัวอย่าง PHP foreach ค่าย่อย ตัวอย่างจะถูกเก็บไว้ในรูปแบบ asciidoc ภายใต้โฟลเดอร์ docs/examples
วิธีที่แนะนำในการติดตั้ง Elasticsearch-Php คือผ่านนักแต่งเพลง
เพิ่ม elasticsearch/elasticsearch เป็นการพึ่งพาในไฟล์ composer.json ของโครงการของคุณ (เปลี่ยนเวอร์ชันเพื่อให้เหมาะกับ Elasticsearch เวอร์ชันของคุณเช่นสำหรับ ES 7.0):
{
"require" : {
"elasticsearch/elasticsearch" : " ^7.0 "
}
}ดาวน์โหลดและติดตั้ง Composer:
curl -s http://getcomposer.org/installer | phpติดตั้งการอ้างอิงของคุณ:
php composer.phar installต้องการ AutoLoader ของนักแต่งเพลง
นักแต่งเพลงยังเตรียมไฟล์ autoload ที่มีความสามารถในการโหลดคลาสทั้งหมดในไลบรารีใด ๆ ที่ดาวน์โหลด หากต้องการใช้เพียงเพิ่มบรรทัดต่อไปนี้ในกระบวนการ bootstrap ของรหัสของคุณ:
<?php
use Elasticsearch ClientBuilder ;
require ' vendor/autoload.php ' ;
$ client = ClientBuilder:: create ()-> build ();คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการติดตั้งนักแต่งเพลงกำหนดค่าการโหลดอัตโนมัติและแนวปฏิบัติที่ดีที่สุดอื่น ๆ สำหรับการกำหนดการพึ่งพาที่ getComposer.org
เวอร์ชัน 7.0 ของไลบรารีนี้ต้องใช้อย่างน้อย PHP เวอร์ชัน 7.1 นอกจากนี้ยังต้องการส่วนขยาย JSON ดั้งเดิมเป็นเวอร์ชัน 1.3.7 หรือสูงกว่า
| สาขา Elasticsearch-Php | เวอร์ชัน 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 |
เนื่องจาก Insuraquest ใช้ Laravel Jetstream จึงรวมถึงการเข้าสู่ระบบการลงทะเบียนการตรวจสอบอีเมลการตรวจสอบสองปัจจัยและการจัดการเซสชันนอกกรอบ Jetstream ใช้ Laravel Fortify ซึ่งเป็นแบ็กเอนด์ Agnostic Authentication สำหรับ Laravel
ในไฟล์กำหนดค่า config/fortify.php คุณสามารถปรับแต่งแง่มุมต่าง ๆ เลือกแง่มุมที่คุณต้องการนำไปใช้ในโครงการของคุณ ฯลฯ
ตรรกะที่จะดำเนินการตามคำขอการอนุญาตสามารถพบและแก้ไขใน App Actions Fortify
ข้อมูลเพิ่มเติมและเอกสารเกี่ยวกับ JetStream สามารถพบได้ในเว็บไซต์ JetStream
Insuraquest ใช้การอนุญาตผ่านแอตทริบิวต์ 'ประเภท' ซึ่งรวมอยู่ในผู้ใช้แต่ละคน มีสี่ประเภท: แขกผู้ใช้บรรณารักษ์และผู้ดูแลระบบ ประเภททำเรียงซ้อน แต่ละระดับใหม่มีสิทธิ์ของระดับต่ำกว่า + สิทธิ์เพิ่มเติม
การอนุญาตถูกบังคับใช้ในเส้นทางที่แตกต่างกัน (web.php) ในมุมมองที่หลากหลายมันยังถูกบังคับใช้ในระดับมุมมองโดยใช้ Laravel @can และ @cannot
ประเภทสามารถปรับได้ในฐานข้อมูลโดยตรงหรือใน 'การบริหารผู้ใช้' หน้าเมื่อคุณลงชื่อเข้าใช้ด้วย adminaccount
เมื่อผู้เข้าชมยังไม่ได้ลงชื่อเข้าใช้เขาจะถูกเปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ โดยค่าเริ่มต้น - เมื่อผู้ใช้ใหม่ได้รับการลงทะเบียน - เขาได้รับมอบหมายประเภท 'แขก' เขาจะสามารถเห็นหน้า Landingpage และเอกสาร แต่ไม่สามารถสอบถามเอกสารใด ๆ ได้ ผู้ใช้สามารถสอบถามเอกสารเปิดและส่งอีเมลได้ บรรณารักษ์สามารถอัปโหลดไฟล์ใหม่ลบไฟล์และเปลี่ยนแท็กได้ ผู้ดูแลระบบสามารถดูผู้ใช้ข้อมูลทั้งหมดและปรับประเภทของพวกเขา
คำอธิบายของการตั้งค่าการปรับใช้
"external" : {
"properties" : {
"title" : {
"type" : " text "
},
"language" : {
"type" : " keyword "
},
"date_published" : {
"type" : " date "
},
"issuer" : {
"type" : " keyword "
},
"category" : {
"type" : " keyword "
},
"tag" : {
"type" : " keyword "
}
}
}ถือว่าแข็งแกร่งกว่าเซิร์ฟเวอร์ Laravel ในตัว
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:linkใน Elasticsearch-Php เกือบทุกอย่างได้รับการกำหนดค่าโดยอาร์เรย์เชื่อมโยง จุดสิ้นสุดส่วนที่เหลือเอกสารและพารามิเตอร์เสริม - ทุกอย่างเป็นอาร์เรย์ที่เชื่อมโยงกัน
ในการจัดทำดัชนีเอกสารเราจำเป็นต้องระบุข้อมูลสามชิ้น: ดัชนี, ID และเอกสารเอกสาร สิ่งนี้ทำได้โดยการสร้างอาร์เรย์ที่เชื่อมโยงของคีย์: คู่ค่า ตัวตนของตัวเองเป็นอาร์เรย์ที่เชื่อมโยงกับคีย์: คู่ค่าที่สอดคล้องกับข้อมูลในเอกสารของคุณ:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id ' ,
' body ' => [ ' testField ' => ' abc ' ]
];
$ response = $ client -> index ( $ params );
print_r ( $ response );การตอบสนองที่คุณได้รับกลับระบุว่าเอกสารถูกสร้างขึ้นในดัชนีที่คุณระบุ การตอบสนองเป็นอาร์เรย์ที่เชื่อมโยงที่มีรุ่นที่ถอดรหัสของ JSON ที่ 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
)มารับเอกสารที่เราเพิ่งจัดทำดัชนีกันเถอะ สิ่งนี้จะส่งคืนเอกสาร:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> get ( $ params );
print_r ( $ response ); การตอบสนองมีข้อมูลเมตาบางส่วน (ดัชนีเวอร์ชัน ฯลฯ ) รวมถึงฟิลด์ _source ซึ่งเป็นเอกสารต้นฉบับที่คุณส่งไปยัง Elasticsearch
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[_seq_no] => 0
[_primary_term] => 1
[found] => 1
[_source] => Array
(
[testField] => abc
)
) หากคุณต้องการดึงฟิลด์ _source โดยตรงมีวิธีการ getSource :
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ source = $ client -> getSource ( $ params );
print_r ( $ source ); การตอบสนองจะเป็นเพียงค่า _source :
Array
(
[testField] => abc
)การค้นหาเป็นจุดเด่นของ Elasticsearch ดังนั้นเรามาทำการค้นหากันเถอะ เราจะใช้การสืบค้นการแข่งขันเป็นการสาธิต:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' query ' => [
' match ' => [
' testField ' => ' abc '
]
]
]
];
$ response = $ client -> search ( $ params );
print_r ( $ response ); การตอบสนองนั้นแตกต่างจากคำตอบก่อนหน้าเล็กน้อย เราเห็นข้อมูลเมตาบางอย่าง ( took timed_out ฯลฯ ) และอาร์เรย์ชื่อ hits นี่แสดงถึงผลการค้นหาของคุณ ด้านในของ hits เป็นอาร์เรย์อื่นชื่อ hits ซึ่งมีผลการค้นหาแต่ละรายการ:
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
)
)
)
)
)เอาล่ะไปข้างหน้าและลบเอกสารที่เราเพิ่มก่อนหน้านี้:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> delete ( $ params );
print_r ( $ response ); คุณจะสังเกตเห็นว่านี่เป็นไวยากรณ์ที่เหมือนกันกับไวยากรณ์ get ความแตกต่างเพียงอย่างเดียวคือการดำเนินการ: delete แทนที่จะ get การตอบกลับจะยืนยันว่าเอกสารถูกลบ:
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
)เนื่องจากลักษณะแบบไดนามิกของ Elasticsearch เอกสารแรกที่เราเพิ่มดัชนีโดยอัตโนมัติด้วยการตั้งค่าเริ่มต้นบางอย่าง ลองลบดัชนีนั้นเพราะเราต้องการระบุการตั้งค่าของเราเองในภายหลัง:
$ deleteParams = [
' index ' => ' my_index '
];
$ response = $ client -> indices ()-> delete ( $ deleteParams );
print_r ( $ response );การตอบสนอง:
Array
(
[acknowledged] => 1
)ตอนนี้เรากำลังเริ่มต้นใหม่ (ไม่มีข้อมูลหรือดัชนี) มาเพิ่มดัชนีใหม่ด้วยการตั้งค่าที่กำหนดเอง:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' settings ' => [
' number_of_shards ' => 2 ,
' number_of_replicas ' => 0
]
]
];
$ response = $ client -> indices ()-> create ( $ params );
print_r ( $ response );Elasticsearch จะสร้างดัชนีนั้นด้วยการตั้งค่าที่คุณเลือกและส่งคืนการรับทราบ:
Array
(
[acknowledged] => 1
) บรรณารักษ์มีความเป็นไปได้ที่จะอัปโหลดไฟล์ใหม่ เมื่ออัปโหลดเอกสารเป็นไปได้ที่จะเพิ่มแท็กลงในเอกสารที่อัปโหลด เนื้อหาสำหรับแท็กจะถูกดึงจากตาราง MySQL และเพิ่มลงในแบบฟอร์ม
FileUploadController.php
$ this ->validate( $ request , [
' title ' => ' required ' ,
' language ' => ' required ' ,
' date ' => ' required|date ' ,
' issuer ' => ' required ' ,
' category ' => ' required ' ,
' tag ' => ' required ' ,
' file ' => ' required|mimes:pdf|max:2048 '
]เมื่อมีการอัปโหลดเอกสารไฟล์และแท็กจะถูกโพสต์ไปยัง Fscrawler ซึ่งจะจัดทำดัชนีเอกสารก่อนที่จะเพิ่มลงในโหนด Elasticsearch ของเรา
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 ;
} ปลั๊กอินถูกเพิ่มสำหรับรูปแบบฟอร์ม -> tailwind.config.js
https://tailwindcss-custom-forms.netlify.app/
plugins: [
require ( ' @tailwindcss/custom-forms ' ),
] หลังจากผู้ใช้ได้รับผลการค้นหาทั้งหมดของเขาเขาสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับผลลัพธ์ใด ๆ
ที่นี่เขามีความเป็นไปได้ที่จะแก้ไขลบหรือส่งไฟล์ PDF ที่แสดง
ไฟล์ที่แก้ไขหรือสร้างขึ้นสำหรับฟังก์ชันการทำงานทางไปรษณีย์คือ
คำสั่งที่ใช้คลาส markdown ที่ใช้งานได้ทางไปรษณีย์ที่ใช้สำหรับการสร้างอีเมล
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
ตัวควบคุมเมลโดยพื้นฐานแล้วเราจะกำหนดให้มีตรรกะเพื่อแสดงรายการของผู้ใช้ เรียกใช้คำสั่งเพื่อสร้างคอนโทรลเลอร์
php artisan make:controller MailController
ความเป็นไปได้ในการทดสอบฟังก์ชั่นอีเมล http: // localhost: 8000/send -email -> ส่งอีเมลไปยัง MailTrap (BART บัญชี)
TODO: ใช้ฟังก์ชันการทำงานของเมลลงในผลการค้นหาเดียว
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 aboveนั่นเป็นเพียงภาพรวมการล่มของลูกค้าและไวยากรณ์ หากคุณคุ้นเคยกับ Elasticsearch คุณจะสังเกตเห็นว่าวิธีการดังกล่าวมีชื่อเหมือนกับจุดสิ้นสุดของ REST
นอกจากนี้คุณยังจะสังเกตเห็นว่าไคลเอนต์ได้รับการกำหนดค่าในลักษณะที่อำนวยความสะดวกในการค้นพบได้ง่ายผ่าน IDE การกระทำหลักทั้งหมดมีอยู่ภายใต้วัตถุ $client (การจัดทำดัชนีการค้นหาการรับ ฯลฯ ) การจัดการดัชนีและคลัสเตอร์อยู่ภายใต้ $client->indices() และ $client->cluster() ตามลำดับ
ตรวจสอบเอกสารที่เหลือเพื่อดูว่าลูกค้าทั้งหมดทำงานอย่างไร
โปรดทราบว่าโครงการนี้มีไว้สำหรับใช้ภายในบริบทของโรงเรียน เพื่อการพัฒนาเพิ่มเติมโปรดติดต่อ TE
ผู้ใช้อาจเลือกใบอนุญาตที่ต้องการใช้ เนื่องจากไม่มีการแยกแยะการเรียกใช้งานหรือชุดแจกจ่ายเพื่อแยกความแตกต่างการออกใบอนุญาตผู้ใช้ควรจัดทำเอกสารทางเลือกใบอนุญาตของพวกเขาจากภายนอกในกรณีที่ไลบรารีถูกกระจายอีกครั้ง หากไม่มีการเลือกที่ชัดเจนสมมติฐานคือการแจกจ่ายซ้ำกฎของใบอนุญาตทั้งสอง