SpringBootはElasticSearchを詳細に統合し、関連する使用方法を説明します

SpringBootはElasticSearchを詳細に統合し、関連する使用方法を説明します

環境: springboot2.4.12 + ElasticSearch7.8.0

導入

Elasticsearch は、Lucene をベースにした分散検索エンジンです。これは、Lucene の基礎となる詳細をシールドし、分散機能を提供し、外部に RESTful API を提供します。 Elasticsearch はその使いやすさですぐに多くのユーザーを獲得し、Web サイトの検索やログ分析など、さまざまな場面で使用されています。 ES の強力な水平スケーラビリティにより、ES を NoSQL として直接使用する人も多くいます。

ES を使用する理由

  1. 分散機能: Elasticsearch は分散型であり、数百または数千のサーバーに拡張して PB レベルのデータを処理できます。
  2. 全文検索機能: Elasticsearch は Lucene 上に構築されているため、全文検索のパフォーマンスが非常に優れています。
  3. ほぼリアルタイムの検索: Elasticsearch はほぼリアルタイムの検索プラットフォームです。ドキュメントのインデックス作成からドキュメントが検索可能になるまでの遅延は非常に短く、通常は 1 秒だけです。したがって、セキュリティ分析やインフラストラクチャ監視など、時間的に重要なユースケースに最適です。
  4. 豊富な機能: Elasticsearch には、速度、スケーラビリティ、弾力性に加えて、データ集約やインデックスライフサイクル管理などの強力な組み込み機能が多数備わっており、ユーザーはこれらの機能を使用してデータをより効率的に保存および検索できます。
  5. データ処理の簡素化: Beats および Logstash との統合により、ユーザーは Elasticsearch でインデックスを作成する前にデータを簡単に処理できます。同時に、Kibana は Elasticsearch データのリアルタイムの視覚化を提供するだけでなく、ユーザーがアプリケーション パフォーマンス監視 (APM)、ログ、インフラストラクチャ インジケーターなどのデータにすばやくアクセスするための UI も提供します。

ES はなぜこんなに速いのでしょうか?

Elasticsearch が高速である主な理由は、分散アーキテクチャとほぼリアルタイムの検索テクノロジーを使用しているためです。

まず、Elasticsearch は複数のノードから構成され、各ノードが独立してデータを保存および処理できる分散検索エンジンです。この分散アーキテクチャにより、Elasticsearch は数百、数千のサーバーに簡単に拡張し、大量のデータを処理できます。

第二に、Elasticsearch はほぼリアルタイムの検索テクノロジーを使用します。ドキュメントがインデックス化されると、数秒以内に検索可能になります。このほぼリアルタイムの検索テクノロジーにより、Elasticsearch はユーザーの検索リクエストに迅速に応答し、検索のパフォーマンスと効率を向上させることができます。

さらに、Elasticsearch は、ドキュメント内の各単語をインデックス項目として取得し、それを逆インデックスに保存する逆インデックス テクノロジーも使用します。この転置インデックス技術により、Elasticsearch は特定の単語を含むドキュメントをすばやく見つけることができるため、検索パフォーマンスがさらに向上します。

最後に、Elasticsearch は豊富なクエリ関数と最適化アルゴリズムも提供しており、ユーザーのクエリ要件とデータ特性に基づいてインテリジェントな最適化を実行し、検索精度と応答速度を向上させることができます。

まとめると、Elasticsearch が高速である理由は、分散アーキテクチャ、ほぼリアルタイムの検索技術、転置インデックス技術、最適化アルゴリズムなどのさまざまな技術的手段を使用して、大量のデータを効率的に処理し、ユーザーの検索要求に迅速に応答し、検索精度と応答速度を向上させることができるためです。

次に、SpringBootにElasticSearchを統合する方法を紹介します。

関連する依存関係とアプリケーション構成

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>

設定ファイル

spring: elasticsearch: rest: uris: - http://localhost:9201 --- logging: level: com.pack: debug org.springframework.data.elasticsearch.core: debug

データモデルの確立

@Document(createIndex = true, indexName = "products", shards = 3, replicas = 1) public class Product { @Id private Long id ; @Field(analyzer = "ik_max_word", type = FieldType.Text) private String title ; @Field(type= FieldType.Keyword) private String category ; @Field(type = FieldType.Double) private Double price ; @Field(type = FieldType.Keyword, index = false) private String images ; @Override public String toString() { return "Product [id=" + id + ", title=" + title + ", category=" + category + ", price=" + price + ", images=" + images + "]"; } }

製品リポジトリ

ここでは、data-jpa と同じ ElasticsearchRepository を継承するだけで済みます。

 public interface ProductRepository extends ElasticsearchRepository<Product, Long> { }

ElasticsearchRepository を継承した後、findBy* やその他の構文を使用して、data-jpa などの関連クエリ メソッドを記述することもできます。

  • メソッド名でサポートされているキーワード

写真

メソッドの戻り値の型

  1. リスト<T>
  2. ストリーム<T>
  3. 検索ヒット<T>
  4. リスト<検索ヒット<T>>
  5. ストリーム<SearchHit<T>>
  6. 検索ページ<T>

リポジトリは、@Query アノテーションを使用したカスタム クエリ文字列もサポートします。

 public interface ProductRepository extends ElasticsearchRepository<Product, Long> { List<Product> findByTitle(String title) ; @Query("{\"fuzzy\": {\"title\": \"?0\"}}") Page<Product> findByTitle(String sex,Pageable pageable); // 自定义查询@Query("{\"match\": {\"category\": \"?0\"}}") Page<Product> findByCategory(String category,Pageable pageable); // 高亮设置@Highlight(fields = {@HighlightField(name = "title"), @HighlightField(name = "category")}) List<SearchHit<Product>> findByTitleOrCategory(String title, String category,Pageable pageable) ; }

Repository メソッドを使用するだけでなく、ElasticsearchRestTemplate メソッドを使用してサービスをリクエストすることもできます。次のテスト

テスト

@Resource private ProductRepository productRepository ; @Resource private ElasticsearchRestTemplate elasticTemplate ; @Test public void testCreate() { Product product = new Product() ; product.setId(3L) ; product.setCategory("配件") ; product.setPrice(299.5d) ; product.setImages("http://www.pack.com/memory.jpg") ; product.setTitle("很牛逼的内存条") ; productRepository.save(product) ; } @Test public void testQuery() { Product product = productRepository.findById(1L).orElse(null) ; System.out.println(product) ; } @Test public void testFindAll() { Pageable pageable = PageRequest.of(1, 2) ; Page<Product> page = productRepository.findAll(pageable) ; System.out.println(page.getTotalPages() + "\n" + page.getContent()) ; } @Test public void testTermSearch() { for (Product p : productRepository.findByTitle("Java从入门到精通")) { System.out.println(p) ; } } @Test public void testFindByTitle() { Pageable pageable = PageRequest.of(0, 2) ; Page<Product> page = productRepository.findByTitle("Java", pageable) ; System.out.println(page.getTotalPages() + "\n" + page.getContent()) ; } @Test public void testFindByCategory() { Pageable pageable = PageRequest.of(0, 2) ; Page<Product> page = productRepository.findByCategory("书籍", pageable) ; System.out.println(page.getTotalPages() + "\n" + page.getContent()) ; } @Test public void testCriteriaQuery() { Criteria criteria = new Criteria("price").greaterThan(50).lessThan(80); Query query = new CriteriaQuery(criteria); SearchHits<Product> hits = elasticTemplate.search(query, Product.class, IndexCoordinates.of("products")) ; for (SearchHit<Product> hit : hits) { System.out.println(hit) ; } } @Test public void testStringQuery() { Query query = new StringQuery("{ \"match\": { \"category\": { \"query\": \"配件\" } } } "); SearchHits<Product> hits = elasticTemplate.search(query, Product.class); for (SearchHit<Product> hit : hits) { System.out.println(hit) ; } } @Test public void testStringQueryFuzzy() { Query query = new StringQuery("{ \"fuzzy\":{\"title\":{\"value\":\"Java\"}} }"); HighlightQuery highlightQuery = null ; HighlightBuilder highBuilder = new HighlightBuilder().preTags("<font color='red'>").postTags("</font>").field("title") ; highlightQuery = new HighlightQuery(highBuilder) ; query.setHighlightQuery(highlightQuery) ; SearchHits<Product> hits = elasticTemplate.search(query, Product.class); for (SearchHit<Product> hit : hits) { System.out.println(hit + "\n" + hit.getHighlightField("title")) ; } }

サービスが開始されると、インデックスが自動的に作成されます。

Chrome プラグイン ElasticSearch Head をインストールすると、es のステータスとインデックス情報を簡単に表示できます。

写真

ES クラスターのステータス

写真

完了! ! !

<<:  クラウドの近代化は総合的なアプローチになる

>>:  Log4j 脆弱性詳細レビュー シリーズ 1: 攻撃の背景

推薦する

私の記事は他人の服を着ている

今日の社会では、文学、機械、デザインなどあらゆる分野で独創性がますます重視されるようになっています。...

ウェブサイトの基盤をしっかり構築する方法

本日お伝えしたいのは、Web サイトの初期段階で強固な基盤を築く方法です。良いスタートは必ずしも戦い...

Redis 分散ロックの原理がまだわかりませんか?早く学んでみませんか?

[[321595]]学校で小さなプロジェクトに取り組んでいたとき、Redis を使用していましたが、...

dedipathはどうですか?ロサンゼルスデータセンターの独立サーバーの簡易評価と実際のテストデータの共有

dedipath は近年誰もが知っているアメリカのサーバー業者のはずです。ホリデーシーズンには VP...

キーワードの積み重ねによりウェブサイトの最適化が低下してはならない

ウェブサイトの最適化にはキーワード密度という概念があることは誰もが知っています。一般的に、ウェブサイ...

無敵のウェブサイトを構築する方法

多くの同僚が、Web サイトのコンバージョン率というトピックについて話しているのを耳にしました。これ...

検索エンジン最適化(SEO)関連用語

ディレクトリディレクトリは人間が編集した検索結果です。ほとんどのディレクトリは、スパイダーではなく人...

hostbd24 - $10/年/512MB メモリ/5GB SSD/1TB トラフィック/G ポート/ロサンゼルス

hostbd24.com はバングラデシュのホスティング会社です。4 人のメンバーで構成され、200...

Huawei Cloud FusionInsightが第1位にランクイン、顧客のデジタル変革のための強固なデータ基盤を提供

最近、工業情報化部は返答書を発表し、次のステップは「ビッグデータ産業発展第14次5カ年計画」の公布を...

VMware Photon プラットフォームはどこにありますか?

[[203967]] vMware GitHub wiki ページには、さまざまなインストール タイ...

テンセントクラウドが「タレントプラン」を開始、人材育成に参加する企業は100万以上のリソースサポートを享受できる

ポストパンデミック時代において、「新しいインフラ」は「ハイライトの瞬間」を迎えます。業界の観点から見...

hostdoc: 新しいロサンゼルス データ センター、I9-9900K+NVMe SSD+10Gbps 帯域幅を使用した安価で高性能な VPS

Hostdoc は、米国ロサンゼルスに新しいデータセンターを追加することを発表しました。このマシン群...

imidcロシアデータセンターのCN2ラインの物理サーバー(実際には3ラインリターンCN2)の簡単な評価

Rainbow Network は、ロシアのサーバー、香港のサーバー、台湾のサーバー、日本のサーバー...

有料リンクはランキングを素早く向上させる素晴らしい方法です

SEO に詳しい人は、外部リンクがランキングに影響を与える重要な要素であり、最も重要な要素である可能...

タオバオアライアンス:今年のサードパーティ開発者からのCPS収益シェアは5億ドルに達する可能性がある

eTao.comの子会社であるTaobao Allianceが4月16日に発表したデータによると、2...