SpringBoot-検索
1.検索の基本概念
1. ElasticSearchの概要
オープンソースのElasticSearch(ES)は、分散型でスケーラブルなリアルタイムの検索およびデータ分析エンジンです。Spring Bootは、Spring Data ElasticSearchを統合することにより、非常に便利な検索機能のサポートを提供します。
ElasticsearchはJavaで記述されており、インデックス作成と検索に内部的にLuceneを使用しますが、その目的は全文検索を簡単にすることです。Luceneの複雑さを隠すことで、代わりにシンプルで一貫性のあるRESTful APIのセットを提供します(リクエストを介して)検索)、最下層はLuceneに基づいており、データのセキュリティを確保するために複数のシャード(シャーディング)を使用し、自動リシャーディング機能を提供します。githubなどの大規模なサイトでも検索サービスとしてElasticSearchを使用しています。
ElasticSearch:
- 分散型のリアルタイムドキュメントストレージ。各フィールドにインデックスを付けて検索できます。
- 分散型リアルタイム分析検索エンジン
- 数百のサービスノードを拡張し、PBレベルの構造化データまたは非構造化データをサポートできます
2.機能
(1)ドキュメント指向:
Elasticsearchはドキュメント指向です。つまり、オブジェクト全体またはドキュメント全体を格納します。Elasticsearchはドキュメントを保存するだけでなく、各ドキュメントのコンテンツにインデックスを付けて取得できるようにします。Elasticsearchでは、行と列のデータの代わりに、ドキュメントのインデックス作成、取得、並べ替え、フィルタリングを行います。これはデータについてのまったく異なる考え方であり、Elasticsearchが複雑な全文検索をサポートできるのはそのためです。
(2)JSONシリアル化:
Elasticsearchは、ドキュメントのシリアル化形式としてJavaScript Object Notation(またはJSON)を使用します。JSONシリアル化は、ほとんどのプログラミング言語でサポートされており、NoSQLフィールドの標準形式になっています。
注:
Luceneはオープンソースの全文検索エンジンツールキットですが、完全な全文検索エンジンではなく、全文検索エンジンアーキテクチャであり、テキスト分析エンジンの一部である完全なクエリエンジンとインデックス作成エンジンを提供します。 (英語2つの西洋言語とドイツ語)。Luceneの目的は、ソフトウェア開発者にシンプルで使いやすいツールキットを提供して、ターゲットシステムに全文検索機能を簡単に実装すること、またはこれに基づいて完全な全文検索エンジン(Elasticsearch)を構築することです。
3. ElasticSearchアーキテクチャ
3つのデータID1、2、3があり、各jsonデータはドキュメントです。インデックス、タイプ、およびドキュメントは、Mysqlのデータベース、データテーブル、および行と列のデータに類似しています。
2、インストールテスト
1.サーチミラー
docker search elasticsearch
2.画像をプルします
docker pull
ez.mirror.aliyuncs.com/library/elasticsearch
3.表示
docker images
4.実行中の
elasticsearchはJavaで記述されており、実行時にデフォルトで2Gのヒープメモリスペースを占有します。これ-e
を使用して、ヒープメモリの使用を制限できます。
docker run -e ES_JAVA_OPTS="-Xms256m -Xms256m" -d
-p 9200:9200 -p 9300:9300 --name ES01 5acf0e8da90b
Elasticsearchの各ノード間の通信はポート9300を使用し、Web通信検索はポート9200を使用します
5.
docker psをチェックして、実行されているかどうかを確認します。実行されていない場合は、すべてのコンテナーdocker ps-aをチェックします。
docker ps
6.
開いているポート9200および9300をテストします。ファイアウォールをオフにするか、クラウドサーバーのポートを開きます。
サーバーのポート9200にアクセスします。
3、elasticsearchの基本的な使用法
Elasticsearchの公式ドキュメント:https:
//www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
1.インデックスデータ
Elasticsearchにデータを保存する
Postmanを使用してデータを送信します:
PUTリクエストを送信します:http:// IPアドレス:9200 / megacorp / employee / 1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
パス/ megacorp / employee / 1には、次の3つの情報が含まれています。
- megacorp:インデックス名
- 従業員:タイプ名
- 1:従業員ID
受け取った応答:
2.ドキュメントを取得する
GETリクエストを送信します:http:// IP address:9200 / megacorp / employee / 1
ここで、versionは変更されたバージョンを表します。
3.存在するかどうかを確認します
ヘッドリクエストを送信します。データが存在する場合は、200が表示されます。
4.削除
DELETEリクエストを送信します。削除されたドキュメントが存在しない場合は、404が表示されます。
5.軽量検索
(1)すべての従業員を検索します:
GET / megacorp / employee / _search
(2)
姓がSmithである従業員を検索しますGET / megacorp / employee / _search?q = last_name:Smith
(3)クエリ式を送信して
POST / megacorp / employee / _searchをクエリします
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
(4)全文検索
POST / megacorp / employee / _search
は、ロッククライミングが好きなすべての従業員を検索し、一致はすべての類似性の結果を取得します。
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
(5)フレーズ検索
match_phrase、完全一致結果を取得します。
POST / megacorp / employee / _search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
(6)検索を強調表示する
POST / megacorp / employee / _search
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {
}
}
}
}
返された応答では、ブラウザの処理を容易にするために、aboutに対応する検索フィールドにhtmlハイライトタグが追加されています。
"highlight": {
"about": [
"I love to go <em>rock</em> <em>climbing</em>"
]}
4、SpringBoot-elasticsearchの統合
最新の操作については、SpringBootの公式ドキュメントを参照してください:https://docs.spring.io/spring-data/elasticsearch/docs/4.1.2/reference/html/#preface.metadata
1.SpringBootがElasticSearchを統合するためのいくつかの方法
ESは2つのプロトコルをサポートします
- HTTPプロトコル、サポートされるクライアントはJestクライアントとRestクライアントです
- ネイティブElasticsearchバイナリプロトコル、つまり、トランスポートクライアントとノードクライアント
HTTPプロトコル:
Jestクライアントは公式にはサポートされていません。ES5.0以前は、提供された公式クライアントはトランスポートクライアントとノードクライアントのみでした。5.0以降、Restクライアントが正式にリリースされ、強く推奨されます。
ネイティブElasticsearchバイナリプロトコル:
トランスポートクライアント(7.0で非推奨)とノードクライアント(2.3で非推奨)の違い:これら2つは最初の2つのクライアントであり、トランスポートクライアントは個別のノードを必要としません。ノードクライアントは、別のノードを確立し、操作のためにノードに接続する必要があります。ES2.3の前は、独立したAPIがあります。ES2.3の後、APIは破棄されます。ユーザーがノードを作成し、に接続することをお勧めします。操作のためにクライアントを転送します。
ReactiveElasticsearchClient:
ReactiveElasticsearchClientは、WebClientに基づく非公式のドライバーです。Elasticsearchコアプロジェクトによって提供されるリクエスト/レスポンスオブジェクトを使用します。呼び出しはリアクティブスタックで直接操作され、非同期(スレッドプールにバインドされた)応答をリアクティブタイプにラップしません。
関係者は、トランスポートクライアントの代わりにJava高レベルRESTクライアントを使用することを強くお勧めします。
Restクライアントは、Java Low Level RestClientとJavaHigh Level RestClientに分けられます。
現在、SpringBoot 2.4.1は、デフォルトでJava High Level RestClientをサポートしています。
2.バージョン対応
3.依存関係を導入します
SpringBootは、デフォルトでSpringDataelasticsearchモジュールを使用して動作します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
4、application.properties
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
5.データを保存する
@Autowired
RestHighLevelClient restHighLevelClient;
@Test
void add() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", "20190909");
map.put("name", "测试");
map.put("age", 22);
try {
IndexRequest indexRequest = new IndexRequest("content", "doc", map.get("id").toString()).source(map);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
結果:
6.データを取得します
何か問題があります:
SearchRequest searchRequest = new SearchRequest().indices("content").types("doc");
7.データを更新します
@Test
void update() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", "20190909");
map.put("name", "测试-update");
map.put("age", 22);
try {
UpdateRequest request = new UpdateRequest("content", "doc", map.get("id").toString()).doc(map);
UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(updateResponse.toString());
} catch (Exception e) {
}
}
データが更新された後:
8.データを取得する
@Test
void get() {
try {
GetRequest request = new GetRequest("content", "doc", "20190909");
GetResponse getResponse = this.restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(getResponse.toString());
} catch (Exception e) {
}
}
9.データを削除します
@Test
void delete() {
try {
DeleteRequest request = new DeleteRequest("content", "doc", "20190909");
DeleteResponse deleteResponse = this.restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.toString());
} catch (Exception e) {
}
}
参照ブログ:https://blog.csdn.net/qq_25012687/article/details/101050412