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: 攻撃の背景

推薦する

クラウドコンピューティング市場の次のトレンド: エンタープライズコミュニケーションクラウドが大きく進歩

現在のクラウド コンピューティング市場には、ますます多くのメーカーが注目せざるを得ない重要なシグナル...

外国のサーバーは、ビデオウェブサイト、ビデオサーバー、大規模な帯域幅と大規模なトラフィックに適しています。

ビデオウェブサイト、ビデオスライス、ライブストリーミングウェブサイト、CDN配信、さらにはダウンロー...

頼林鋒:115クラウドディスクは閉鎖されず、関連するソーシャルプラットフォームが立ち上げられる

南都ニュース記者李星星:東莞のインターネットの「兄貴分」115クラウドディスクが最近、最前線に躍り出...

SEO のエキスパートと SEO の敗者を分ける 8 つの領域

SEO 業界は標準化されていません。SEO エンジニアの中には、高額の給与を稼ぎ、大規模な Web ...

Amazon Web Services は、MindPower が世界中のゲーム開発者にサービスを提供するクラウド ゲーム ソリューションを構築するのを支援します。

北京 – 2022 年 9 月 7 日、アマゾン ウェブ サービスは、ゲーム開発者がクラウド ゲーム...

テンセントと奇虎の敵対関係:テンセントが開放を加速し、360の株価が急騰

テンセントの市場支配力の乱用に対するQihoo 360の控訴が最高人民法院で始まる中、インターネット...

中国の母子産業研究報告書

コア要約:発展の歴史:過去30年間の中国の急速な経済発展に伴い、母子保健産業は初期の形成、急速な発展...

超低価格をお見逃しなく、天一雲の年中プロモーションがここにあります

現在、デジタル変革はあらゆる分野において避けられない選択となっており、多くの企業がビジネスの回復力と...

国内化粧品ブランドのソーシャルメディアマーケティング事例

近年、中国の伝統的なスタイルやトレンドが非常に人気となり、新しく最先端の化粧品ブランドが急速に台頭し...

Godaddy 10月 2.95 米ドル登録またはドメイン名割引コード

Godaddy の 10 月の 2.95 USD ドメイン名登録または移管割引コード: iap295...

hosthatch-香港 VPS/softlayer/月額 2.6 ドル/256m メモリ/30g SSD/1T トラフィック

私たちがまだ hostUS の特別な香港 VPS を応援している間に、hosthatch はひっそり...

海外調達:綱渡りビジネスの巨大産業チェーンには法的リスクが潜む

わが国では、海外購買は非常に成熟した産業チェーンを形成しています。国内の大手電子商取引プラットフォー...

edgenat: 月払い20%オフ/年払い30%オフ、韓国の超ハイエンド専用サーバー、韓国CN2 VPS、香港CN2 VPS、米国VPS(中国聯通AS4837大帯域幅)

edgenat が今月ご提供するプロモーションでは、すべての月々の支払いが 20% オフになり、年末...

U-Mail は夏の繁忙期に旅行代理店のメールマーケティングを支援します

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています夏休みがや...