Um projeto escolar do projeto de programação do curso 2, Grupo 2, Bacharelado Profissional "Aplicou -o" em Erasmumshogeschool Bruxel.
Pesquisa do mecanismo de pesquisa para documentos de seguro. As companhias de seguros armazenam documentos sobre legislação, jurisprudência e doutrina legal em seu campo particular. O objetivo é fornecer aos funcionários um aplicativo de mecanismo de pesquisa fácil de usar, com base nos algorythms da estrutura do Elasticsearch.
| Componente | Versão |
|---|---|
| Linux Ubuntu | |
| FScrawler | |
| Elasticsearch | 6.8 |
| Elasticsearch-php | 6.7 |
| Php | 7.4.10 (CLI) |
| Compositor | 2.0.6 |
| Instalador do Laravel | 4.1.0 |
| Mysql |
Nota: O FSCRAWLER VXXXX é compatível apenas com o Elasticsearch 6.8. Consequentemente, requer o pacote elasticsearch-php v6.7 em seu arquivo Laravel Composer.json
A documentação completa pode ser encontrada aqui. Os documentos são armazenados dentro do repo em /docs /; portanto, se você vir um erro de digitação ou problema, envie um PR para corrigi -lo!
Também fornecemos um gerador de exemplos de código para PHP usando o script util/GenerateDocExamples.php . Este comando analisa o arquivo util/alternative_report.spec.json produzido a partir desta especificação JSON e gera os exemplos de php para o valor de digestão. Os exemplos são armazenados no formato ASCIIDOC na pasta docs/examples .
O método recomendado para instalar o Elasticsearch-php é através do compositor.
Adicione elasticsearch/elasticsearch como uma dependência no arquivo composer.json do seu projeto (altere a versão para se adequar à sua versão do Elasticsearch, por exemplo, para ES 7.0):
{
"require" : {
"elasticsearch/elasticsearch" : " ^7.0 "
}
}Baixe e instale o Composer:
curl -s http://getcomposer.org/installer | phpInstale suas dependências:
php composer.phar installRequer o AutoLoader do compositor
O Composer também prepara um arquivo automático capaz de carregar automaticamente todas as classes em qualquer uma das bibliotecas que ele baixar. Para usá -lo, basta adicionar a seguinte linha ao processo de bootstrap do seu código:
<?php
use Elasticsearch ClientBuilder ;
require ' vendor/autoload.php ' ;
$ client = ClientBuilder:: create ()-> build ();Você pode descobrir mais sobre como instalar o Composer, configurar o AutoLoading e outras melhores práticas para definir dependências em getcomposer.org.
A versão 7.0 desta biblioteca requer pelo menos PHP versão 7.1. Além disso, requer que a extensão JSON nativa seja a versão 1.3.7 ou superior.
| Elasticsearch-php ramo | Versão 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 |
Como a InsuraQuest usa o Laravel JetStream, inclui login, registro, verificação de email, autenticação de dois fatores e gerenciamento de sessão pronta para uso. O JetStream usa o Laravel Fortify, que é um back-end de autenticação agnóstica de front-end para Laravel.
No arquivo de configuração config/fortify.php Você pode personalizar os diferentes aspectos, escolha quais aspectos você deseja implementar em seu projeto etc.
A lógica a ser executada na solicitação de autorização pode ser encontrada e modificada no app ações fortify.
Mais informações e documentação sobre o JetStream podem ser encontradas no site do JetStream.
A InsuraQuest implementa a autorização através do atributo 'Tipo', incluído em cada instância do usuário. Existem quatro tipos: convidado, usuário, bibliotecário e administrador. Os tipos são feitos em cascata. Cada novo nível tem as permissões do nível abaixo + permissões adicionais.
A autorização é aplicada nas diferentes rotas (web.php). Em vistas mistas, ele também é aplicado no nível da visualização, implementando o nativo Laravel @Can e @Cannot.
Os tipos podem ser ajustados diretamente no banco de dados ou na página de 'Administração do Usuário' quando você estiver conectado com um administrador.
Quando um visitante ainda não está assinado, ele será redirecionado para a tela de login. Por padrão - quando um novo usuário é registrado - ele recebe o tipo 'Guest'. Ele poderá ver o LandingPage e a documentação, mas não pode consultar nenhum documento. Um usuário pode consultar documentos, abri -los e enviá -los. Um bibliotecário pode fazer upload de novos arquivos, excluir arquivos e alterar as tags neles. Um administrador pode visualizar todos os usuários, suas informações e ajustar seu tipo.
Descrição da configuração de implantação.
"external" : {
"properties" : {
"title" : {
"type" : " text "
},
"language" : {
"type" : " keyword "
},
"date_published" : {
"type" : " date "
},
"issuer" : {
"type" : " keyword "
},
"category" : {
"type" : " keyword "
},
"tag" : {
"type" : " keyword "
}
}
}Considerado mais robusto que o servidor Laravel embutido.
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:linkNo Elasticsearch-php, quase tudo é configurado por matrizes associativas. O terminal de restos, o documento e os parâmetros opcionais - tudo é uma matriz associativa.
Para indexar um documento, precisamos especificar três informações: índice, ID e um corpo de documentos. Isso é feito pela construção de uma matriz associativa de pares de chave: value. O órgão de solicitação é por si só uma matriz associativa com a chave: pares de valor correspondentes aos dados em seu documento:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id ' ,
' body ' => [ ' testField ' => ' abc ' ]
];
$ response = $ client -> index ( $ params );
print_r ( $ response );A resposta que você volta indica que o documento foi criado no índice que você especificou. A resposta é uma matriz associativa que contém uma versão decodificada do JSON que elasticsem devoluções:
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
)Vamos obter o documento que acabamos de indexar. Isso simplesmente retornará o documento:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> get ( $ params );
print_r ( $ response ); A resposta contém alguns metadados (índice, versão, etc.), bem como um campo _source , que é o documento original que você enviou para o Elasticsearch.
Array
(
[_index] => my_index
[_type] => _doc
[_id] => my_id
[_version] => 1
[_seq_no] => 0
[_primary_term] => 1
[found] => 1
[_source] => Array
(
[testField] => abc
)
) Se você deseja recuperar o campo _source diretamente, existe o método getSource :
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ source = $ client -> getSource ( $ params );
print_r ( $ source ); A resposta será apenas o valor _source :
Array
(
[testField] => abc
)A pesquisa é uma marca registrada do Elasticsearch, então vamos realizar uma pesquisa. Vamos usar a consulta de partida como demonstração:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' query ' => [
' match ' => [
' testField ' => ' abc '
]
]
]
];
$ response = $ client -> search ( $ params );
print_r ( $ response ); A resposta é um pouco diferente das respostas anteriores. Vemos alguns metadados ( took , timed_out , etc.) e uma matriz chamada hits . Isso representa seus resultados de pesquisa. Inside of hits está outra matriz denominada hits , que contém resultados de pesquisa individuais:
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
)
)
)
)
)Tudo bem, vamos em frente e excluir o documento que adicionamos anteriormente:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id '
];
$ response = $ client -> delete ( $ params );
print_r ( $ response ); Você notará que isso é uma sintaxe idêntica à sintaxe get . A única diferença é a operação: delete em vez de get . A resposta confirmará que o documento foi excluído:
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
)Devido à natureza dinâmica do Elasticsearch, o primeiro documento adicionamos automaticamente um índice com algumas configurações padrão. Vamos excluir esse índice porque queremos especificar nossas próprias configurações mais tarde:
$ deleteParams = [
' index ' => ' my_index '
];
$ response = $ client -> indices ()-> delete ( $ deleteParams );
print_r ( $ response );A resposta:
Array
(
[acknowledged] => 1
)Agora que estamos começando frescos (sem dados ou índices), vamos adicionar um novo índice com algumas configurações personalizadas:
$ params = [
' index ' => ' my_index ' ,
' body ' => [
' settings ' => [
' number_of_shards ' => 2 ,
' number_of_replicas ' => 0
]
]
];
$ response = $ client -> indices ()-> create ( $ params );
print_r ( $ response );Elasticsearch agora criará esse índice com as configurações escolhidas e retornará um reconhecimento:
Array
(
[acknowledged] => 1
) Um bibliotecário tem a possibilidade de fazer upload de novos arquivos. Ao fazer o upload de um documento, é possível adicionar tags ao documento carregado. O conteúdo das tags é puxado de uma tabela MySQL e adicionado ao formulário.
FileUploadController.php
$ this ->validate( $ request , [
' title ' => ' required ' ,
' language ' => ' required ' ,
' date ' => ' required|date ' ,
' issuer ' => ' required ' ,
' category ' => ' required ' ,
' tag ' => ' required ' ,
' file ' => ' required|mimes:pdf|max:2048 '
]Quando um documento é enviado, o arquivo e as tags são publicados no FSCRAWLER, que indexará o documento antes de adicionar ao nosso nó 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 ;
} Um plug -in é adicionado para o layout do formulário -> Tailwind.config.js
https://tailwindcss-custom-forms.netlify.app/
plugins: [
require ( ' @tailwindcss/custom-forms ' ),
] Depois que um usuário obtém todos os resultados da pesquisa, ele pode visualizar mais detalhes sobre qualquer um dos resultados.
Aqui ele tem a possibilidade de editar, excluir ou enviar o PDF mostrado.
Arquivos modificados ou criados para funcionalidade de email são
Os comandos usavam a classe de marcação por correio Laravel usada para criar e -mails.
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
Controlador de email, essencialmente definiremos a lógica para exibir a lista do usuário. Execute o comando para criar o controlador.
php artisan make:controller MailController
Possibilidade de testar a função de email http: // localhost: 8000/send -email -> envia e -mail para mailtrap (conta bart)
TODO: Implemente a funcionalidade de email no resultado de uma pesquisa
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 aboveEssa foi apenas uma visão geral do cliente do cliente e de sua sintaxe. Se você estiver familiarizado com o Elasticsearch, notará que os métodos são nomeados como os pontos de extremidade Rest.
Você também notará que o cliente está configurado de uma maneira que facilita a descoberta fácil via IDE. Todas as ações principais estão disponíveis no objeto $client (indexação, pesquisa, obtenção, etc.). O gerenciamento de índice e cluster estão localizados nos objetos $client->indices() e $client->cluster() , respectivamente.
Confira o restante da documentação para ver como o cliente inteiro funciona.
Observe que este projeto é para uso no contexto da escola. Para um desenvolvimento adicional, entre em contato com a TE
O usuário pode escolher qual licença eles desejam usar. Como não existe um pacote de execução ou distribuição discriminatório para diferenciar o licenciamento, o usuário deve documentar sua opção de licença externamente, caso a biblioteca seja re-distribuída. Se nenhuma escolha explícita for feita, a suposição é que a redistribuição obedece as regras de ambas as licenças.