Un projet scolaire du Course Programming Project 2, Groupe 2, Bachelor professionnel "Appliquée" à Erasmumshogeschool Brussel.
Demande de moteur de recherche pour les documents d'assurance. Les compagnies d'assurance stockent des documents sur la législation, la jurisprudence et la doctrine juridique dans leur domaine particulier. L'objectif est de fournir aux employés une application de moteur de recherche facile à utiliser basée sur les algorythms du cadre Elasticsearch.
| Composant | Version |
|---|---|
| Linux Ubuntu | |
| Fscrawler | |
| Elasticsearch | 6.8 |
| Elasticsearch-php | 6.7 |
| Php | 7.4.10 (CLI) |
| Compositeur | 2.0.6 |
| Installateur de Laravel | 4.1.0 |
| Mysql |
Remarque: FSCRAWLER VXXXX est uniquement compatible avec Elasticsearch 6.8. Par conséquent, nécessite un package Elasticsearch-PHP V6.7 dans votre fichier Laravel Composer.json
Une documentation complète peut être trouvée ici. Les documents sont stockés dans le repo sous / docs /, donc si vous voyez une faute de frappe ou un problème, veuillez soumettre un PR pour le réparer!
Nous fournissons également un générateur d'exemples de code pour PHP à l'aide du script util/GenerateDocExamples.php . Cette commande analyse le fichier util/alternative_report.spec.json produit à partir de cette spécification JSON et génère les exemples PHP pour la valeur de digestion. Les exemples sont stockés au format ASCIIDOC dans le dossier docs/examples .
La méthode recommandée pour installer Elasticsearch-PHP est via le compositeur.
Ajoutez elasticsearch/elasticsearch comme dépendance dans le fichier composer.json de votre projet (modifier la version en fonction de votre version d'Elasticsearch, par exemple pour ES 7.0):
{
"require" : {
"elasticsearch/elasticsearch" : " ^7.0 "
}
}Télécharger et installer le compositeur:
curl -s http://getcomposer.org/installer | phpInstallez vos dépendances:
php composer.phar installBesoin de l'autoloader du compositeur
Le compositeur prépare également un fichier Autoload capable de faire automatiquement toutes les classes de l'une des bibliothèques qu'il télécharge. Pour l'utiliser, ajoutez simplement la ligne suivante au processus bootstrap de votre code:
<?php
use Elasticsearch ClientBuilder ;
require ' vendor/autoload.php ' ;
$ client = ClientBuilder:: create ()-> build ();Vous pouvez en savoir plus sur la façon d'installer Composer, de configurer la mise en œuvre de mise en scène et d'autres meilleures pratiques pour définir les dépendances sur getComposer.org.
La version 7.0 de cette bibliothèque nécessite au moins PHP version 7.1. De plus, il nécessite que l'extension JSON native soit la version 1.3.7 ou plus.
| Branche elasticsearch-php | Version 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 |
Étant donné qu'InsuraQuest utilise Laravel Jetsstream, il comprend la connexion, l'enregistrement, la vérification par e-mail, l'authentification à deux facteurs et la gestion de session. Jetsstream utilise Laravel Fortify, qui est un backend d'authentification agnostique frontal pour Laravel.
Dans le fichier de configuration config / fortify.php, vous pouvez personnaliser les différents aspects, choisir les aspects que vous souhaitez implémenter sur votre projet, etc.
La logique à exécuter sur la demande d'autorisation peut être trouvée et modifiée dans App Actions Fortify.
Plus d'informations et de documentation sur Jetsstream peuvent être trouvées sur le site Web de Jetsstream.
InsuraQuest implémente l'autorisation via l'attribut «type» qui est inclus dans chaque instance utilisateur. Il existe quatre types: invité, utilisateur, bibliothécaire et administrateur. Les types sont fabriqués en cascade. Chaque nouveau niveau a les autorisations du niveau inférieur à + les autorisations supplémentaires.
L'autorisation est appliquée sur les différents itinéraires (web.php). Sur les vues mixtes, il est également appliqué au niveau de la vue en mettant en œuvre le Laravel @Can et @cannot natifs.
Les types peuvent être ajustés directement dans la base de données ou sur la page «User Administration» lorsque vous êtes connecté avec un administrateur.
Lorsqu'un visiteur n'est pas encore connecté, il sera redirigé vers l'écran de connexion. Par défaut - lorsqu'un nouvel utilisateur est enregistré - il se voit attribuer le type «invité». Il pourra voir la page de landage et la documentation, mais ne peut interroger aucun document. Un utilisateur peut interroger des documents, les ouvrir et les envoyer par la poste. Un bibliothécaire peut télécharger de nouveaux fichiers, supprimer des fichiers et modifier les balises dessus. Un administrateur peut afficher tous les utilisateurs, leurs informations et ajuster son type.
Description de la configuration du déploiement.
"external" : {
"properties" : {
"title" : {
"type" : " text "
},
"language" : {
"type" : " keyword "
},
"date_published" : {
"type" : " date "
},
"issuer" : {
"type" : " keyword "
},
"category" : {
"type" : " keyword "
},
"tag" : {
"type" : " keyword "
}
}
}Considéré comme plus robuste que le serveur Laravel intégré.
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:linkDans Elasticsearch-PHP, presque tout est configuré par des tableaux associatifs. Le point de terminaison de repos, le document et les paramètres facultatifs - tout est un tableau associatif.
Pour indexer un document, nous devons spécifier trois informations: index, ID et un corps de document. Cela se fait en construisant un tableau associatif de paires de clés: valeur. Le corps de demande est lui-même un tableau associatif avec des paires de clés: Valeur correspondant aux données de votre document:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id ' ,
' body ' => [ ' testField ' => ' abc ' ]
];
$ response = $ client -> index ( $ params );
print_r ( $ response );La réponse que vous récupérez indique que le document a été créé dans l'index que vous avez spécifié. La réponse est un tableau associatif contenant une version décodée du JSON que renvoie 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
)Obtenons le document que nous venons d'indexer. Cela rendra simplement le document:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> get ( $ params );
print_r ( $ response ); La réponse contient des métadonnées (index, version, etc.) ainsi qu'un champ _source , qui est le document original que vous avez envoyé à Elasticsearch.
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[_seq_no] => 0
[_primary_term] => 1
[found] => 1
[_source] => Array
(
[testField] => abc
)
) Si vous souhaitez récupérer directement le champ _source , il existe la méthode getSource :
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ source = $ client -> getSource ( $ params );
print_r ( $ source ); La réponse ne sera que la valeur _source :
Array
(
[testField] => abc
)La recherche est une caractéristique d'Elasticsearch, alors effectuons une recherche. Nous allons utiliser la requête de match comme démonstration:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' query ' => [
' match ' => [
' testField ' => ' abc '
]
]
]
];
$ response = $ client -> search ( $ params );
print_r ( $ response ); La réponse est un peu différente des réponses précédentes. Nous voyons quelques métadonnées ( took , timed_out , etc.) et un tableau nommé hits . Cela représente vos résultats de recherche. À l'intérieur des hits se trouve un autre tableau nommé hits , qui contient des résultats de recherche individuels:
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
)
)
)
)
)Très bien, allons-y et supprimons le document que nous avons ajouté précédemment:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> delete ( $ params );
print_r ( $ response ); Vous remarquerez qu'il s'agit d'une syntaxe identique à la syntaxe get . La seule différence est l'opération: delete au lieu de get . La réponse confirmera que le document a été supprimé:
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
)En raison de la nature dynamique d'Elasticsearch, le premier document que nous avons ajouté a automatiquement construit un index avec certains paramètres par défaut. Supprimons cet index car nous voulons spécifier nos propres paramètres ultérieurement:
$ deleteParams = [
' index ' => ' my_index '
];
$ response = $ client -> indices ()-> delete ( $ deleteParams );
print_r ( $ response );La réponse:
Array
(
[acknowledged] => 1
)Maintenant que nous commençons frais (pas de données ou d'index), ajoutons un nouvel index avec certains paramètres personnalisés:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' settings ' => [
' number_of_shards ' => 2 ,
' number_of_replicas ' => 0
]
]
];
$ response = $ client -> indices ()-> create ( $ params );
print_r ( $ response );Elasticsearch créera désormais cet index avec les paramètres de votre choix et renvoie un accusé de réception:
Array
(
[acknowledged] => 1
) Un bibliothécaire a la possibilité de télécharger de nouveaux fichiers. Lors du téléchargement d'un document, il est possible d'ajouter des balises au document téléchargé. Le contenu des balises est tiré d'une table MySQL et ajouté au formulaire.
FileUploadController.php
$ this ->validate( $ request , [
' title ' => ' required ' ,
' language ' => ' required ' ,
' date ' => ' required|date ' ,
' issuer ' => ' required ' ,
' category ' => ' required ' ,
' tag ' => ' required ' ,
' file ' => ' required|mimes:pdf|max:2048 '
]Lorsqu'un document est téléchargé, le fichier et les balises sont publiés sur FSCRAWLER, qui indexeront le document avant d'ajouter à notre nœud 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 ;
} Un plugin est ajouté pour la disposition du formulaire -> tailwind.config.js
https://tailwindcss-custom-forms.netlify.app/
plugins: [
require ( ' @tailwindcss/custom-forms ' ),
] Une fois qu'un utilisateur a obtenu tous ses résultats de recherche, il peut afficher plus de détails sur l'un des résultats.
Ici, il a la possibilité de modifier, de supprimer ou de poster le PDF montré.
Les fichiers modifiés ou créés pour les fonctionnalités de messagerie sont
Les commandes ont utilisé Laravel Mailable Markdown Classe utilisée pour créer des e-mails.
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
Contrôleur de messagerie, nous définirons essentiellement la logique pour afficher la liste de l'utilisateur. Exécutez la commande pour créer le contrôleur.
php artisan make:controller MailController
Possibilité de tester la fonction de messagerie électronique http: // localhost: 8000 / Send-email -> envoie le courrier à MailTrap (compte BART)
TODO: implémentez la fonctionnalité de messagerie dans le résultat de la recherche
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 aboveCe n'était qu'un aperçu de la plainte du client et de sa syntaxe. Si vous connaissez ElasticSearch, vous remarquerez que les méthodes sont nommées comme des points de terminaison de repos.
Vous remarquerez également que le client est configuré d'une manière qui facilite une découverte facile via l'IDE. Toutes les actions de base sont disponibles sous l'objet $client (indexation, recherche, obtention, etc.). L'index et la gestion des cluster sont situés dans les objets $client->indices() et $client->cluster() , respectivement.
Consultez le reste de la documentation pour voir comment le client entier fonctionne.
Veuillez noter que ce projet est utilisé dans le contexte de l'école. Pour plus de développement, veuillez contacter TE
L'utilisateur peut choisir la licence qu'il souhaite utiliser. Étant donné qu'il n'y a pas de forfait exécutable ou de distribution discriminant pour différencier l'octroi de licences, l'utilisateur doit documenter son choix de licence en externe, au cas où la bibliothèque serait redistribuée. Si aucun choix explicite n'est fait, l'hypothèse est que la redistribution obéit aux règles des deux licences.