在springboot 中使用elasticsearch

2020-12-27 愛上樹的程序猿

在springBoot 中使用Elasticsearch

Elasticsearch是一個全文本搜尋引擎,專門用於處理大型數據集。根據此描述,自然使用它來存儲和搜索應用程式日誌。與Logstash和Kibana一起,它是稱為Elastic Stack的強大解決方案的一部分。

保留應用程式日誌並不是Elasticsearch的唯一一種用法。它通常用作具有主關係資料庫的應用程式的輔助資料庫。如果您必須對大型數據集執行全文搜索,或者僅存儲許多不再由應用程式修改的歷史記錄,則這種方法特別有用。當然,對於這種方法的優缺點總是存在疑問。當使用包含相同數據的兩個不同數據源時,必須首先考慮同步。您有幾種選擇。根據關係資料庫供應商的不同,您可以利用包含SQL更新歷史記錄的二進位或事務日誌。這種方法需要一些中間件,該中間件先讀取日誌,然後將數據放入Elasticsearch。您始終可以將全部責任移到資料庫端(觸發)或Elasticsearch端(JDBC插件)。 無論您如何將數據導入Elasticsearch,都必須考慮另一個問題。數據結構。您可能在關係資料庫中的幾個表之間分配了數據。如果您想利用Elasticsearch的優勢,則應將其存儲為單個類型。它迫使您保留冗餘數據,從而導致更大的磁碟空間使用。當然,如果查詢比關係資料庫中的等效查詢運行得更快,那麼這種效果是可以接受的。好的,在介紹了很長時間之後,讓我們繼續該示例。Spring Boot提供了一種通過Spring Data存儲庫與Elasticsearch進行交互的簡便方法。

1.啟用ELASTICSEARCH支持

按照Spring Boot的習慣,我們不必在上下文中提供任何其他Bean來支持對Elasticsearch的支持。我們只需要包括以下對我們的依賴pom.xml:

默認情況下,應用程式嘗試與localhost上的Elasticsearch連接。如果我們使用另一個目標URL,則需要在配置設置中覆蓋它。這是我們application.yml文件的片段,它將默認集群名稱和地址覆蓋為在Docker容器上啟動的Elasticsearch的地址:

應用程式可以通過Spring Boot Actuator health端點公開Elasticsearch連接的健康狀態。首先,您需要包括以下Maven依賴項:

默認情況下,運行狀況檢查是啟用的,並且Elasticsearch檢查是自動配置的。但是,此驗證是通過Elasticsearch Rest API客戶端執行的。在這種情況下,我們需要重寫spring.elasticsearch.rest.uris負責設置REST客戶端使用的地址的屬性:

2.運行ELASTICSEARCH

對於我們的測試,我們需要在開發模式下運行的單節點Elasticsearch實例。和往常一樣,我們將使用Docker容器。這是啟動Docker容器並將其公開在port 9200和上的命令9300。

3.建立SPRING數據倉庫

要啟用Elasticsearch存儲庫,我們只需要使用以下方法注釋main或configuration類@EnableElasticsearchRepositories:

下一步是創建擴展的存儲庫接口CrudRepository。它提供了一些基本操作,例如save或findById。如果您想要其他一些find方法,則應遵循Spring Data命名約定在接口內定義新方法。

4.實體對象

我們的實體的關係結構被平整到單個Employee包含相關對象(對象Organization,Department)。您可以將這種方法與在RDBMS中為一組相關表創建視圖進行比較。在Spring Data Elasticsearch命名法中,單個對象存儲為文檔。因此,您需要使用注釋您的對象@Document。您還應該設置Elasticsearch目標索引的名稱,類型和ID。可以使用@Field注釋配置其他映射。

5.初始化

正如我在序言中提到的那樣,您可能決定使用Elasticsearch的主要原因是需要處理大數據。因此,需要用許多文檔填充我們的測試Elasticsearch節點。如果您想一步插入許多文檔,則絕對應該使用Bulk API。批量API使在單個API調用中執行許多索引/刪除操作成為可能。這樣可以大大提高索引速度。批量操作可以通過Spring Data ElasticsearchTemplatebean 執行。它還在Spring Boot上自動配置。模板提供bulkIndex了將索引查詢列表作為輸入參數的方法。這是在應用程式啟動時插入樣本測試數據的bean的實現:

如果您不需要在啟動時插入數據,則可以通過將屬性設置initial-import.enabled為禁用該過程false。這是SampleDataSetbean 的聲明:

6.查看數據並運行查詢

假設您已經啟動了示例應用程式,負責批量索引的bean沒有被禁用,並且您有足夠的耐心等待幾個小時,直到所有數據都已插入到Elasticsearch節點中,現在它包含employee類型為100M的文檔。值得顯示有關集群的一些信息。您可以使用Elasticsearch查詢來執行此操作,也可以下載可用的GUI工具之一,例如ElasticHQ。幸運的是,ElasticHQ也可以作為Docker容器使用。您必須執行以下命令以使用ElasticHQ啟動容器:

$ docker run -d --name elastichq -p 5000:5000 elastichq/elasticsearch-hq

啟動ElasticHQ GUI後,可以通過埠5000上的Web瀏覽器訪問GUI。其Web控制臺提供有關集群,索引的基本信息,並允許執行查詢。您只需要輸入Elasticsearch節點地址,即可使用統計信息將您重定向到主儀錶板。這是ElasticHQ的主要儀錶板。

如您所見,我們有一個索引,稱為sample5個分片。這是Spring Data提供的默認值@Document,可以用field覆蓋shards。單擊它後,我們可以導航到索引管理面板。您可以對索引執行一些操作,例如清除緩存或刷新索引。您還可以查看所有分片的統計信息。

為了當前的測試目的,我有大約2500萬個(大約3GB的空間)Employee類型的文檔。我們可以執行一些測試查詢。我已經公開了兩個搜索端點:按員工姓名GET /employees/{name}和按組織名稱GET /employees/organization/{organizationName}。結果並不壓倒一切。我認為使用相同數量的數據可以為關係資料庫帶來相同的結果。

7.測試

好的,我們已經完成開發並在大數據集上執行了一些手動測試。現在,是時候創建一些在內置時間運行的集成測試了。我們可以使用允許在JUnit測試期間自動使用資料庫啟動Docker容器的庫– Testcontainers。有關此庫的更多信息,請訪問其站。幸運的是,Testcontainers支持Elasticsearch。要在測試範圍內啟用它,您首先需要包括以下對您的依賴pom.xml:

下一步是定義@ClassRule或@Rule指向Elasticsearch容器的bean。它會在測試類之前或在每個類之前自動啟動,具體取決於您使用的注釋。公開的埠號是自動生成的,因此您需要檢索設置為spring.data.elasticsearch.cluster-nodes屬性值的埠號。這是我們的JUnit集成測試的完整實現:

相關焦點

  • pacebox-springboot 1.1.2 發布,java生態框架
    案例 inter-boot-demo              springboot版demo(spring boot+權限管理+elasticsearch日誌+數據加解密+分布式追蹤(基於opentracing) inter-micro-demo             springcloud版demo(spring cloud nacos+
  • 讓Elasticsearch飛起來!百億級實時查詢優化實戰
    經過對 Elasticsearch 多方調研和超過幾百億條數據的插入和聚合查詢的驗證之後,我們總結出以下幾種能夠有效提升性能和解決這一問題的方案:本文所使用的 Elasticsearch 版本為 5.3.3。
  • ElasticSearch 中的中文分詞器以及索引基本操作詳解
    過濾:比如停用詞過濾器會從詞條中去除不相干的詞條(的,嗯,啊,呢);另外還有同義詞過濾器、小寫過濾器等。ElasticSearch 中內置了多種分詞器可以供使用。內置分詞器:1.2 中文分詞器在 Es 中,使用較多的中文分詞器是 elasticsearch-analysis-ik,這個是 es 的一個第三方插件,代碼託管在 GitHub 上。
  • 使用Elasticsearch做一個好用的日語搜尋引擎及自動補全 - 計算機...
    日語搜索的特殊性以 Elastic 的介紹語「Elasticsearchは、予期した結果や、そうでないものも検索できるようにデータを集めて格納するElastic Stackのコア製品です」為例。作為搜尋引擎,當然希望用戶能通過句子中的所有主要關鍵詞,都能搜索到這條結果。和英文一樣,日語的動詞根據時態語境等,有多種變化。
  • ElasticSearch新版功能驚人
    日前Elastic發布了Elasticsearch 7.10.0後又持續更新了7.10.1。該版本基於Apache Lucene 8.7.0開發,支持在Elasticsearch 在線彈性雲和自建實例使用。現在就快速瀏覽下7.10的驚人特性。
  • Elasticsearch 索引設計實戰指南
    題記  隨著 Elastic 的上市,ELK Stack 不僅在 BAT 的大公司得到長足的發展,而且在各個中小公司都得到非常廣泛的應用,甚至連「婚慶網站」都開始使用 Elasticsearch 了。隨之而來的是 Elasticsearch 相關部署、框架、性能優化的文章早已鋪天蓋地。
  • Elasticsearch索引生命周期管理方案
    一、前言在 Elasticsearch 的日常中,有很多如存儲 系統日誌、行為數據等方面的應用場景,這些場景的特點是數據量非常大,並且隨著時間的增長 索引 的數量也會持續增長,然而這些場景基本上只有最近一段時間的數據有使用價值或者會被經常使用(熱數據),而歷史數據幾乎沒有作用或者很少會被使用(冷數據),這個時候就需要對 索引 進行一定策略的維護管理甚至是刪除清理
  • springboot中使用swagger3的初步試探
    今天用以前的方式使用swagger以後時不時的出現404界面,查資料後未能解決,初步判斷為兼容性問題,這個時候我決定採用最新的集成到springboot 中的swagger,首先引用<dependency><groupId>io.springfox</groupId
  • SpringBoot開發常用的註解及作用
    隨著網際網路的快速發展,不斷的湧出新的技術,springboot是什麼呢?springboot它是spring開源組織下的子項目,主要是用來簡化spring的難度以及不足,節省程式設計師的繁重的配置,為程式設計師開發過程中各種啟動器。
  • 【微服務】159:Elasticsearch的使用
    有了id之後我們就可以去進行修改和刪除數據的操作了,如果不是系統隨機的id不容易記住,使用起來不方便。 3修改數據 其中關於id的作用: 如果id在文檔中不存在,則新增該數據,就相當於通過POST添加了一條數據。 如果id在文檔中存在,則修改對應id數據。 也通過PUT請求既能完成新增操作又能完成修改操作,一般都會直接使用PUT。
  • springboot整合mybatis如何進行單元測試
    前言:之前使用的SSM框架(spring,springmvc,mybatis),整合時需要創建各種配置文件進行各種配置,有時感覺挺繁瑣的,之後開發中使用到了springboot,感覺真的是節約了很多的時間,整合其他框架時,明顯效率高了很多。
  • 黑客入侵了超過1.5萬臺Elasticsearch伺服器
    1 黑客入侵了超過1.5萬臺Elasticsearch伺服器在過去的兩周裡,一名黑客入侵了Elasticsearch伺服器,這些伺服器在沒有密碼的情況下一直處於開放狀態,並試圖刪除其內容,同時還留下了一家網絡安全公司的名字
  • 一黑客清除1.5萬多個Elasticsearch伺服器 並試圖栽贓嫁禍
    一黑客清除1.5萬多個Elasticsearch伺服器 並試圖栽贓嫁禍 站長之家(ChinaZ.com) 4月3日 消息:在過去的兩周裡,一名黑客入侵了沒有密碼處於開放狀態的
  • SpringBoot+GitLab+Docker+Jenkins實現持續集成下
    springboot !ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jarENTRYPOINT ["java", "-jar", "springboot_jenkins01.jar"]這一切都準備完畢之後,我們把項目push到上一節搭建好的GitLab中。
  • 啥,聽說你用了springboot,但是開發的接口還在裸奔?
    id=5fe86eb74c636312f4b709551、應用場景簡介啥,聽說你用了springboot,但是開發的接口還在裸奔?快來試試這個PopularMVC吧,它也許是你想要找的神器!神器亮相springboot叫一鍵啟動,popularmvc為你的springboot項目插上翅膀,力求一鍵起飛!
  • Springboot學習:Springboot的特點及核心功能概述
    Springboot中可以獨立運行,一個main方法加載Springboot運行代碼。圖片來源於網絡2.2內嵌servletSpringboot為web工程提供了內嵌的web容器,默認使用tomcat,並且按照習慣進行默認配置,例如埠號8080 項目訪問路徑 /.結合第一個特點,web工程就可以不用封裝war包訪問外部的web容器運行,直接使用jar包運行。
  • 面試題:SpringBoot的啟動流程
    面試題:SpringBoot的啟動流程不管是用springboot開發還是面試,都需要對SpringBoot的啟動流程所了解。下面是一個標準的springboot程序springboot程序啟動程序執行SpringApplication.run方法,我們先看看run方法導致幹了什麼?