Un proyecto escolar del Proyecto de programación de cursos 2, Grupo 2, Bachelor profesional "Aplicó" en ErasmumShogeschool Brussel.
Aplicación del motor de búsqueda para documentos de seguro. Las compañías de seguros almacenan documentos sobre legislación, jurisprudencia y doctrina legal en su campo particular. El objetivo es proporcionar a los empleados una aplicación de motor de búsqueda fácil de usar basada en los algorythms del marco Elasticsearch.
| Componente | Versión |
|---|---|
| Linux ubuntu | |
| Fscrawler | |
| Elasticsearch | 6.8 |
| Elasticsearch-php | 6.7 |
| Php | 7.4.10 (CLI) |
| Compositor | 2.0.6 |
| Instalador de Laravel | 4.1.0 |
| Mysql |
Nota: FSCrawler VXXXX solo es compatible con Elasticsearch 6.8. En consecuencia, requiera paquete elasticsearch-php v6.7 en su archivo laravel composer.json
La documentación completa se puede encontrar aquí. Los documentos se almacenan dentro del Repo Under /Docs /, por lo que si ve un error tipográfico o un problema, ¡envíe un PR para solucionarlo!
También proporcionamos un generador de ejemplos de código para PHP utilizando el script util/GenerateDocExamples.php . Este comando analiza el archivo util/alternative_report.spec.json producido a partir de esta especificación JSON y genera los ejemplos de PHP foreach Digest Value. Los ejemplos se almacenan en formato ASCIIDOC en la carpeta docs/examples .
El método recomendado para instalar ElasticSearch-PHP es a través del compositor.
Agregue elasticsearch/elasticsearch como una dependencia en el archivo composer.json de su proyecto (cambie la versión para adaptarse a su versión de Elasticsearch, por ejemplo para ES 7.0):
{
"require" : {
"elasticsearch/elasticsearch" : " ^7.0 "
}
}Descargar e instalar compositor:
curl -s http://getcomposer.org/installer | phpInstale sus dependencias:
php composer.phar installRequerir el autocoader del compositor
El compositor también prepara un archivo de AuthoLoad que es capaz de atacar todas las clases en cualquiera de las bibliotecas que descarga. Para usarlo, simplemente agregue la siguiente línea al proceso de arranque de su código:
<?php
use Elasticsearch ClientBuilder ;
require ' vendor/autoload.php ' ;
$ client = ClientBuilder:: create ()-> build ();Puede obtener más información sobre cómo instalar el compositor, configurar la autoinforme y otras mejores prácticas para definir dependencias en getComposer.org.
La versión 7.0 de esta biblioteca requiere al menos PHP versión 7.1. Además, requiere que la extensión JSON nativa sea la versión 1.3.7 o superior.
| Rama Elasticsearch-PHP | Versión 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 |
Dado que Insuraquest usa Laravel Jetstream, incluye inicio de sesión, registro, verificación por correo electrónico, autenticación de dos factores y gestión de sesiones fuera de la caja. JetStream usa Laravel Fortify, que es un backend de autenticación agnóstico frontal para Laravel.
En el archivo de configuración config/fortify.php, puede personalizar los diferentes aspectos, elegir qué aspectos desea implementar en su proyecto, etc.
La lógica que se ejecutará en la solicitud de autorización se puede encontrar y modificar en App Actions Fortify.
Puede encontrar más información y documentación en Jetstream en el sitio web de JetStream.
Insuraquest implementa la autorización a través del "tipo de tipo" del atributo que se incluye en cada instancia del usuario. Hay cuatro tipos: invitado, usuario, bibliotecario y administrador. Los tipos se hacen en cascada. Cada nuevo nivel tiene los permisos del nivel inferior a + permisos adicionales.
La autorización se aplica en las diferentes rutas (Web.php). En vistas mixtas, también se aplica a nivel de visión al implementar el laravel @can nativo y @cannot.
Los tipos se pueden ajustar directamente en la base de datos, o en la página 'Administración de usuarios' cuando se inicia sesión con un AdminAccount.
Cuando un visitante aún no se registra, se le redirigirá a la pantalla de inicio de sesión. Por defecto, cuando un nuevo usuario se registra, se le asigna el tipo 'invitado'. Podrá ver la línea de aterrizaje y la documentación, pero no puede consultar ningún documento. Un usuario puede consultar documentos, abrirlos y enviarlos por correo. Un bibliotecario puede cargar archivos nuevos, eliminar archivos y cambiar las etiquetas en ellos. Un administrador puede ver a todos los usuarios, su información y ajustar su tipo.
Descripción de la configuración de implementación.
"external" : {
"properties" : {
"title" : {
"type" : " text "
},
"language" : {
"type" : " keyword "
},
"date_published" : {
"type" : " date "
},
"issuer" : {
"type" : " keyword "
},
"category" : {
"type" : " keyword "
},
"tag" : {
"type" : " keyword "
}
}
}Considerado más robusto que el servidor Laravel incorporado.
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:linkEn ElasticSearch-PHP, casi todo está configurado por matrices asociativas. El punto final REST, el documento y los parámetros opcionales: todo es una matriz asociativa.
Para indexar un documento, necesitamos especificar tres piezas de información: índice, ID y un cuerpo de documentos. Esto se realiza construyendo una matriz asociativa de clave: pares de valor. El cuerpo de solicitud es en sí mismo una matriz asociativa con clave: pares de valor correspondientes a los datos en su documento:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id ' ,
' body ' => [ ' testField ' => ' abc ' ]
];
$ response = $ client -> index ( $ params );
print_r ( $ response );La respuesta que obtiene indica que el documento se creó en el índice que especificó. La respuesta es una matriz asociativa que contiene una versión decodificada del JSON que Elasticsearch regresa:
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
)Obtengamos el documento que acabamos de indexar. Esto simplemente devolverá el documento:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> get ( $ params );
print_r ( $ response ); La respuesta contiene algunos metadatos (índice, versión, etc.), así como un campo _source , que es el documento original que envió a 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 desea recuperar el campo _source directamente, existe el método getSource :
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ source = $ client -> getSource ( $ params );
print_r ( $ source ); La respuesta será solo el valor _source :
Array
(
[testField] => abc
)La búsqueda es un sello distintivo de Elasticsearch, así que realicemos una búsqueda. Vamos a usar la consulta de coincidencia como una demostración:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' query ' => [
' match ' => [
' testField ' => ' abc '
]
]
]
];
$ response = $ client -> search ( $ params );
print_r ( $ response ); La respuesta es un poco diferente de las respuestas anteriores. Vemos algunos metadatos ( took , timed_out , etc.) y una matriz llamada hits . Esto representa sus resultados de búsqueda. Dentro de hits hay otra matriz llamada hits , que contiene resultados de búsqueda individuales:
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
)
)
)
)
)Muy bien, sigamos adelante y eliminemos el documento que agregamos anteriormente:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> delete ( $ params );
print_r ( $ response ); Notará que esta es una sintaxis idéntica a la sintaxis get . La única diferencia es la operación: delete en lugar de get . La respuesta confirmará que se eliminó el documento:
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
)Debido a la naturaleza dinámica de ElasticSearch, el primer documento que agregamos creó automáticamente un índice con algunas configuraciones predeterminadas. Eliminemos ese índice porque queremos especificar nuestra propia configuración más adelante:
$ deleteParams = [
' index ' => ' my_index '
];
$ response = $ client -> indices ()-> delete ( $ deleteParams );
print_r ( $ response );La respuesta:
Array
(
[acknowledged] => 1
)Ahora que estamos comenzando fresco (sin datos o índice), agregemos un nuevo índice con algunas configuraciones personalizadas:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' settings ' => [
' number_of_shards ' => 2 ,
' number_of_replicas ' => 0
]
]
];
$ response = $ client -> indices ()-> create ( $ params );
print_r ( $ response );Elasticsearch ahora creará ese índice con la configuración elegida y devolverá un reconocimiento:
Array
(
[acknowledged] => 1
) Un bibliotecario tiene la posibilidad de cargar archivos nuevos. Al cargar un documento, es posible agregar etiquetas al documento cargado. El contenido de las etiquetas se extrae de una tabla MySQL y se agrega al formulario.
FileUploadController.php
$ this ->validate( $ request , [
' title ' => ' required ' ,
' language ' => ' required ' ,
' date ' => ' required|date ' ,
' issuer ' => ' required ' ,
' category ' => ' required ' ,
' tag ' => ' required ' ,
' file ' => ' required|mimes:pdf|max:2048 '
]Cuando se carga un documento, el archivo y las etiquetas se publican en FSCrawler, que indexará el documento antes de agregar a nuestro nodo 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 ;
} Se agrega un complemento para el diseño de formulario -> tailwind.config.js
https://tailwindcss-custom-forms.netlify.app/
plugins: [
require ( ' @tailwindcss/custom-forms ' ),
] Después de que un usuario obtiene todos sus resultados de búsqueda, puede ver más detalles sobre cualquiera de los resultados.
Aquí tiene la posibilidad de editar, eliminar o enviar el PDF que se muestra.
Los archivos modificados o creados para la funcionalidad de correo son
Los comandos utilizaron la clase de Markdown de Laravel Mailable utilizada para crear correos electrónicos.
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
Controlador de correo, esencialmente definiremos que tenga la lógica para mostrar la lista del usuario. Ejecute el comando para crear el controlador.
php artisan make:controller MailController
Posibilidad de probar la función de correo electrónico http: // localhost: 8000/send -crail -> envía correo a mailtrap (cuenta bart)
TODO: Implemente la funcionalidad de correo en el resultado de la búsqueda
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 aboveEso fue solo una descripción general del curso del cliente y su sintaxis. Si está familiarizado con ElasticSearch, notará que los métodos se denominan como puntos finales REST.
También notará que el cliente está configurado de una manera que facilita el descubrimiento fácil a través del IDE. Todas las acciones principales están disponibles bajo el objeto $client (indexación, búsqueda, obtención, etc.). La gestión del índice y el clúster se encuentran bajo los objetos $client->indices() y $client->cluster() , respectivamente.
Consulte el resto de la documentación para ver cómo funciona todo el cliente.
Tenga en cuenta que este proyecto es para su uso dentro del contexto escolar. Para un mayor desarrollo, comuníquese con TE
El usuario puede elegir qué licencia desea usar. Dado que no hay un paquete de ejecución o distribución discriminatoria para diferenciar la licencia, el usuario debe documentar su elección de licencia externamente, en caso de que la biblioteca se redistribuya. Si no se toma la elección explícita, se supone que la redistribución obedece las reglas de ambas licencias.