コースプログラミングプロジェクト2の学校プロジェクト、グループ2、プロの学士号はErasmumshogeschool Brusselで「Applied It」。
保険文書の検索エンジンアプリケーション。保険会社は、特定の分野で法律、法学、法的教義に関する文書を保管しています。目標は、従業員に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とのみ互換性があります。その結果、laravelcomposer.jsonファイルにパッケージelasticsearch-php v6.7が必要です
完全なドキュメントはこちらをご覧ください。ドキュメントは /docs /docs /にリポジトリに保存されているため、タイプミスや問題がある場合は、PRを送信して修正してください。
また、 util/GenerateDocExamples.phpスクリプトを使用して、PHPのコード例ジェネレーターを提供します。このコマンドは、このJSON仕様から生成されたutil/alternative_report.spec.jsonファイルを解析し、Digest値のPHPの例を生成します。例はdocs/examplesフォルダーの下にAsciidoc形式で保存されます。
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作曲家のオートローダーが必要です
Composerは、ダウンロードするライブラリのすべてのクラスを自動装備できるAutoloadファイルも準備します。それを使用するには、次の行をコードのブートストラッププロセスに追加するだけです。
<?php
use Elasticsearch ClientBuilder ;
require ' vendor/autoload.php ' ;
$ client = ClientBuilder:: create ()-> build ();getcomposer.orgで依存関係を定義するために、Composerのインストール、Autoloading、およびその他のベストプラクティスの設定方法について詳しく知ることができます。
このライブラリのバージョン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を使用しているため、ログイン、登録、電子メールの確認、2要素認証、セッション管理が含まれています。 JetStreamは、Laravel Fortifyを使用します。これは、Laravelのフロントエンドの不可知論的認証バックエンドです。
config/fortify.php configurationファイルで、さまざまな側面をカスタマイズし、プロジェクトなどに実装する側面を選択できます。
承認要求に基づいて実行されるロジックは、App Actions Fortifyで見つけて変更できます。
JetStreamの詳細とドキュメントは、JetStream Webサイトをご覧ください。
Insuraquestは、各ユーザーインスタンスに含まれる属性「タイプ」を通じて承認を実装します。ゲスト、ユーザー、司書、管理者の4つのタイプがあります。タイプはカスケードされています。各新しいレベルには、レベルの権限があり、追加の権限が追加されています。
承認は、異なるルート(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:linkElasticSearch-PHPでは、ほとんどすべてが連想配列によって構成されています。 RESTエンドポイント、ドキュメント、およびオプションのパラメーター - すべてが連想配列です。
ドキュメントにインデックスを作成するには、インデックス、ID、ドキュメント本体の3つの情報を指定する必要があります。これは、キー:バリューペアの連想配列を構築することによって行われます。リクエスト本体自体は、キーを使用した連想配列です。ドキュメント内のデータに対応する値ペア:
$ params = [
' index ' => ' my_index ' ,
' id ' => ' my_id ' ,
' body ' => [ ' testField ' => ' abc ' ]
];
$ response = $ client -> index ( $ params );
print_r ( $ response );戻ってきた応答は、ドキュメントが指定したインデックスで作成されたことを示します。応答は、ElasticSearchが返すJSONのデコードされたバージョンを含む連想配列です。
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構文と同じ構文であることに気付くでしょう。唯一の違いは、操作: get代わりにdeleteことです。応答は、ドキュメントが削除されたことを確認します。
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クラスを使用しました。
php artisan make:mail EmailInsuraquest --markdown=Email.insuraEmail
メールコントローラー、基本的に、ユーザーのリストを表示するロジックがあることを定義します。コマンドを実行してコントローラーを作成します。
php artisan make:controller MailController
電子メール機能をテストする可能性http:// localhost:8000/send -email-> mailtrap(account bart)にメールを送信
TODO:メール機能を1つの検索結果に実装する
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にお問い合わせください
ユーザーは、使用するライセンスを選択できます。ライセンスを区別するための差別的な実行可能または配布バンドルはないため、ライブラリが再配布された場合に備えて、ユーザーはライセンスの選択を外部から文書化する必要があります。明示的な選択が行われない場合、再分配は両方のライセンスのルールに従うと仮定します。