Школьный проект от проекта программирования курса 2, группа 2, профессиональный бакалавр «применил его» в Erasmumshogeschool в Брюсселе.
Заявка на поисковую систему для страховых документов. Страховые компании хранят документы по законодательству, юриспруденции и юридической доктрине в их конкретной области. Цель состоит в том, чтобы предоставить сотрудникам простое в использовании приложение для поисковых систем, основанное на алгориях структуры 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 composer.json
Полную документацию можно найти здесь. Документы хранятся в репо под /docs /, поэтому, если вы видите опечатку или проблему, пожалуйста, отправьте пиар, чтобы исправить его!
Мы также предоставляем генератор примеров кода для PHP, используя сценарий util/GenerateDocExamples.php . Эта команда анализирует файл util/alternative_report.spec.json созданный из этой спецификации JSON, и генерирует значение Digest Fore Pheach. Примеры хранятся в формате Asciidoc в папке docs/examples .
Рекомендуемый метод установки Elasticsearch-Php -через композитор.
Добавьте elasticsearch/elasticsearch в качестве зависимости в файле вашего проекта composer.json (изменить версию в соответствии с вашей версией Elasticsearch, например, для ES 7.0):
{
"require" : {
"elasticsearch/elasticsearch" : " ^7.0 "
}
}Скачать и установить композитор:
curl -s http://getcomposer.org/installer | phpУстановите свои зависимости:
php composer.phar installТребовать автозазагрузчика композитора
Композитор также готовит файл автозагрузки, который способен автоматически загружать все классы в любой из библиотек, которые он загружает. Чтобы использовать его, просто добавьте следующую строку в процесс начальной загрузки вашего кода:
<?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 Branch | 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, который является бэкэнд на фронтальной агностической аутентификации для Laravel.
В файле конфигурации config/fortify.php вы можете настроить различные аспекты, выберите, какие аспекты вы хотите реализовать в своем проекте и т. Д.
Логика, которая должна быть выполнена по запросу на авторизацию, может быть найдена и изменена в App actions fortify.
Более подробную информацию и документацию на JetStream можно найти на веб -сайте JetStream.
Insuraquest реализует авторизацию через атрибут «тип», который включен в каждое пользовательское управление. Есть четыре типа: гость, пользователь, библиотекарь и администратор. Типы становятся каскадными. Каждый новый уровень имеет разрешения уровня ниже + дополнительные разрешения.
Авторизация применяется на разных маршрутах (web.php). На смешанных представлениях он также применяется на уровне просмотра, внедряя нативного Laravel @Can и @Cannot.
Типы могут быть скорректированы в базе данных напрямую или на странице «Администрация пользователя», когда вы подписались с AdminAccount.
Когда посетитель еще не зарегистрирован, он будет перенаправлен на экране для входа в систему. По умолчанию - когда новый пользователь зарегистрируется - ему присваивается «гость». Он сможет увидеть посадочную страницу и документацию, но не может запросить какие -либо документы. Пользователь может запросить документы, открыть их и отправить по почте. Библиотекарь может загружать новые файлы, удалять файлы и изменить теги на них. Администратор может просматривать всех пользователей, их информацию и настроить их тип.
Описание настройки развертывания.
"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 почти все настроено ассоциативными массивами. Конечная точка, документ и дополнительные параметры REST - все является ассоциативным массивом.
Чтобы индексировать документ, нам нужно указать три части информации: индекс, идентификатор и тело документа. Это делается путем построения ассоциативного массива ключей: пары значений. Тело запроса сама по себе является ассоциативным массивом с ключом: пары значений, соответствующие данным в вашем документе:
$ 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.
Изменены или созданные файлы для функциональности почты
Команды использовали Laravel Mailable Markdown Class, используемый для создания электронных писем.
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
Почтовый контроллер, по сути, мы будем определять логику для отображения списка пользователя. Запустите команду, чтобы создать контроллер.
php artisan make:controller MailController
Возможность тестирования функции электронной почты http: // localhost: 8000/send -email -> отправляет почту в Mailtrap (Bart Account)
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
Пользователь может выбрать, какую лицензию они хотят использовать. Поскольку не существует дискриминационного исполняемого или распределительного пакета для дифференциации лицензирования, пользователь должен документировать выбор лицензии извне, если библиотека будет повторно распределена. Если явного выбора не будет сделано, предполагается, что перераспределение подчиняется правилам обеих лицензий.