日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch

發布時間:2023/12/10 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Elasticsearch概念

?以 員工文檔 的形式存儲為例:一個文檔代表一個員工數據。存儲數據到 ElasticSearch 的行為叫做 索引 ,但在索引一個文檔之前,需要確定將文檔存儲在哪里。

?一個 ElasticSearch 集群可以 包含多個 索引 ,相應的每個索引可以包含多個 類型 。 這些不同的類型存儲著多個 文檔 ,每個文檔又有 多個 屬性 。

?類似關系:

–索引-數據庫

–類型-表

–文檔-表中的記錄

–屬性-列

更多詳細內容見官方文檔

二、Elasticsearch入門

2.1、安裝Elasticsearch

1、在虛擬機中通過Docker拉取elasticsearch鏡像

docker pull elasticsearch

2、運行鏡像并使其運行成容器(9200是暴露給web端的,9300是在分布式系統中各個節點交互暴露的接口)

docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name my_es 5acf0e8da90b

3、拷貝配置文件到宿主機(必須保證容器中的ES是啟動狀態)

從這步開始一定要跟著做,不然后面使用SpringData的接口操作時會報錯。詳細見ARTS第三周

docker cp my_es:/usr/share/elasticsearch/config/elasticsearch.yml: /usr/share/elasticsearch.yml

4、停止 和 刪除原來創建的容器

docker stop elasticsearch docker rm my_es

5、重新執行創建容器命令(重點:掛載文件)

docker run -di --name=my_es -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch

6、 修改 /usr/share/elasticsearch.yml 將 transport.host: 0.0.0.0 前的 # 去掉后保存文件退出。 其作用是允許任何ip地址訪問 elasticsearch 開發測試階段可以這么做,生產環境下指定具體的IP

7、重啟后發現重啟啟動失敗了(純宿主機問題),這與我們剛才修改的配置有關,因為elasticsearch在啟動的時候會進行一些檢查,比如最多打開的文件的個數以及虛擬內存區域數量等等

8、系統調優

(1)修改 /etc/security/limits.conf 追加內容

* soft nofile 65536 * hard nofile 65536

說明:nofile是單個進程允許打開的最大文件個數 soft nofile 是軟限制 hard nofile是硬限制 (2)修改 /etc/sysctl.conf 追加內容

vm.max_map_count=655360

說明:限制一個進程可以擁有的VMA(虛擬內存區域)的數量

9、重啟虛擬機

2.2、基本操作

1、存儲文檔

對于雇員目錄,我們將做如下操作:

  • 每個雇員存儲一個文檔,包含該雇員的所有信息。
  • 每個文檔都將是 employee 類型 。
  • 該類型位于 索引 megacorp 內。
  • 該索引保存在我們的 Elasticsearch 集群中。

實踐中這非常簡單(盡管看起來有很多步驟),我們可以通過一條命令完成所有這些動作:

PUT /megacorp/employee/1 {"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rock climbing","interests": [ "sports", "music" ] }

注意,路徑 /megacorp/employee/1 包含了三部分的信息:

  • megacorp
    索引名稱
  • employee
    類型名稱
  • 1
    特定雇員的ID

請求體 —— JSON 文檔 —— 包含了這位員工的所有詳細信息,他的名字叫 John Smith ,今年 25 歲,喜歡攀巖。

很簡單!無需進行執行管理任務,如創建一個索引或指定每個屬性的數據類型之類的,可以直接只索引一個文檔。Elasticsearch 默認地完成其他一切,因此所有必需的管理任務都在后臺使用默認設置完成。

進行下一步前,讓我們增加更多的員工信息到目錄中:

PUT /megacorp/employee/2 {"first_name" : "Jane","last_name" : "Smith","age" : 32,"about" : "I like to collect rock albums","interests": [ "music" ] }PUT /megacorp/employee/3 {"first_name" : "Douglas","last_name" : "Fir","age" : 35,"about": "I like to build cabinets","interests": [ "forestry" ] }

可以使用Postman軟件模擬PUT請求

比如存儲員工id為1的文檔,下面會響應成功后的信息(上面的其他操作同樣)

2、檢索文檔

目前我們已經在 Elasticsearch 中存儲了一些數據, 接下來就能專注于實現應用的業務需求了。第一個需求是可以檢索到單個雇員的數據。

這在 Elasticsearch 中很簡單。簡單地執行 一個 HTTP GET 請求并指定文檔的地址——索引庫、類型和ID。 使用這三個信息可以返回原始的 JSON 文檔:

GET /megacorp/employee/1

返回結果包含了文檔的一些元數據,以及 _source 屬性,內容是 John Smith 雇員的原始 JSON 文檔:

{"_index" : "megacorp","_type" : "employee","_id" : "1","_version" : 1,"found" : true,"_source" : {"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rock climbing","interests": [ "sports", "music" ]} }

將 HTTP 命令由 PUT 改為 GET 可以用來檢索文檔,同樣的,可以使用 DELETE 命令來刪除文檔,以及使用 HEAD 指令來檢查文檔是否存在。如果想更新已存在的文檔,只需再次 PUT 。 3、輕量搜索

一個 GET 是相當簡單的,可以直接得到指定的文檔。 現在嘗試點兒稍微高級的功能,比如一個簡單的搜索!

第一個嘗試的幾乎是最簡單的搜索了。我們使用下列請求來搜索所有雇員:

GET /megacorp/employee/_search

可以看到,我們仍然使用索引庫 megacorp 以及類型 employee,但與指定一個文檔 ID 不同,這次使用 _search 。返回結果包括了所有三個文檔,放在數組 hits 中。一個搜索默認返回十條結果。

{"took": 6,"timed_out": false,"_shards": { ... },"hits": {"total": 3,"max_score": 1,"hits": [{"_index": "megacorp","_type": "employee","_id": "3","_score": 1,"_source": {"first_name": "Douglas","last_name": "Fir","age": 35,"about": "I like to build cabinets","interests": [ "forestry" ]}},{"_index": "megacorp","_type": "employee","_id": "1","_score": 1,"_source": {"first_name": "John","last_name": "Smith","age": 25,"about": "I love to go rock climbing","interests": [ "sports", "music" ]}},{"_index": "megacorp","_type": "employee","_id": "2","_score": 1,"_source": {"first_name": "Jane","last_name": "Smith","age": 32,"about": "I like to collect rock albums","interests": [ "music" ]}}]} }

注意:返回結果不僅告知匹配了哪些文檔,還包含了整個文檔本身:顯示搜索結果給最終用戶所需的全部信息。

接下來,嘗試下搜索姓氏為 Smith 的雇員。為此,我們將使用一個 高亮 搜索,很容易通過命令行完成。這個方法一般涉及到一個 查詢字符串 (query-string) 搜索,因為我們通過一個URL參數來傳遞查詢信息給搜索接口:

GET /megacorp/employee/_search?q=last_name:Smith

我們仍然在請求路徑中使用 _search 端點,并將查詢本身賦值給參數 q= 。返回結果給出了所有的 Smith:

{..."hits": {"total": 2,"max_score": 0.30685282,"hits": [{..."_source": {"first_name": "John","last_name": "Smith","age": 25,"about": "I love to go rock climbing","interests": [ "sports", "music" ]}},{..."_source": {"first_name": "Jane","last_name": "Smith","age": 32,"about": "I like to collect rock albums","interests": [ "music" ]}}]} }

4、 使用查詢表達式搜索

Query-string 搜索通過命令非常方便地進行臨時性的即席搜索 ,但它有自身的局限性(參見 href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html">輕量 搜索)。Elasticsearch 提供一個豐富靈活的查詢語言叫做 查詢表達式 , 它支持構建更加復雜和健壯的查詢。

領域特定語言 (DSL), 指定了使用一個 JSON 請求。我們可以像這樣重寫之前的查詢所有 Smith 的搜索 :

PUT /megacorp/employee/_search {"query" : {"match" : {"last_name" : "Smith"}} }

返回結果與之前的查詢一樣,但還是可以看到有一些變化。其中之一是,不再使用 query-string 參數,而是一個請求體替代。這個請求使用 JSON 構造,并使用了一個 match 查詢(屬于查詢類型之一,后續將會了解)。

5、更復雜的搜索

現在嘗試下更復雜的搜索。 同樣搜索姓氏為 Smith 的雇員,但這次我們只需要年齡大于 30 的。查詢需要稍作調整,使用過濾器 filter ,它支持高效地執行一個結構化查詢。

PUT /megacorp/employee/_search {"query" : {"bool": {"must": {"match" : {"last_name" : "smith" }},"filter": {"range" : {"age" : { "gt" : 30 } }}}} }

目前無需太多擔心語法問題,后續會更詳細地介紹。只需明確我們添加了一個 過濾器 用于執行一個范圍查詢,并復用之前的 match 查詢。現在結果只返回了一個雇員,叫 Jane Smith,32 歲。

{..."hits": {"total": 1,"max_score": 0.30685282,"hits": [{..."_source": {"first_name": "Jane","last_name": "Smith","age": 32,"about": "I like to collect rock albums","interests": [ "music" ]}}]} }

更多詳細內容見官方文檔

三、SpringBoot整合Elasticsearch

3.1、簡介

SpringBoot默認支持兩種技術來和ES交互

1、Jest(默認不生效)需要導入Jest工具包(具體文檔可去Github搜索)

2、SpringBoot提供的API:繼承SpringData的接口和ElasticsearchTempldate組件

需要指定cluster-name和cluster-nodes,這種方法可能會報超時錯誤,就是ES版本不合適

如果版本不適配:

1)、升級Springboot版本

2)、安裝對應版本ElasticSearch

spring data elasticsearch(spring-data-elasticsearch包版本)elasticsearch(ES版本)3.2.x6.5.03.1.x6.2.23.0.x5.5.02.1.x2.4.02.0.x2.2.01.3.x1.5.2

3.2、JestClient操作ES

maven依賴

<!-- 引入操作ElasticSearch的API --><dependency><groupId>io.searchbox</groupId><artifactId>jest</artifactId><version>5.3.3</version></dependency>
  • Article.java
@Data public class Article {@JestIdprivate Integer id;private String author;private String title;private String content;}
  • application.properties
spring.elasticsearch.jest.uris=http://192.168.25.157:9200
  • 測試類
@RunWith(SpringRunner.class) @SpringBootTest public class Springboot11ElasticsearchApplicationTests {@Autowiredprivate JestClient jestClient;@Testpublic void testIndex () throws IOException {Article article = new Article();article.setId(1);article.setAuthor("Yang");article.setTitle("好消息");article.setContent("Hello World");Index index = new Index.Builder(article).index("ahead").type("article").build();jestClient.execute(index);}@Testpublic void testSearch() throws IOException {String json = "{n" +" "query" : {n" +" "match" : {n" +" "content" : "hello"n" +" }n" +" }n" +"}";Search search = new Search.Builder(json).addIndex("ahead").addType("article").build();SearchResult result = jestClient.execute(search);//轉換為對象Article article = result.getSourceAsObject(Article.class, true);//獲取響應的所有信息JsonObject jsonObject = result.getJsonObject();System.out.println(article);System.out.println(jsonObject);}}
  • 先執行存儲文檔方法沒問題,然后再執行檢索方法,結果正確

更多詳細信息參考官方文檔

3.3、SpringData的接口操作ES

  • maven依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
  • Book.java
@Document(indexName = "ahead", type = "book") @Data public class Book { private Integer id; private String name; private String author; }
  • BookRepository.java
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {/*** 按照SpringData所定義的規范來創建方法底層就會幫我們實現* 某個方法對應什么操作具體可參考官方文檔* 通過書名模糊查詢* @param name* @return*/List<Book> findByNameLike(String name); }
  • application.properties
spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=192.168.25.157:9300

cluster-name可通過訪問ip:9200獲取

  • 測試類
@RunWith(SpringRunner.class) @SpringBootTest public class Springboot11ElasticsearchApplicationTests {@Autowiredprivate BookRepository bookRepository;@Testpublic void testRepositoryIndex() {Book book = new Book();book.setId(1);book.setName("西游記");book.setAuthor("吳承恩");bookRepository.index(book);}@Testpublic void testRepositorySearch() {List<Book> book = bookRepository.findByNameLike("游");System.out.println(book);}}
  • 先執行存儲方法沒問題,然后執行檢索方法,結果正確。

3.4、ElasticsearchTemplate操作ES

用的還是上面的環境

  • 測試類
@RunWith(SpringRunner.class) @SpringBootTest public class Springboot11ElasticsearchApplicationTests {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Testpublic void testElasticsearchTemplateIndex() {Book book = new Book();book.setId(2);book.setName("三國演義");book.setAuthor("羅貫中");IndexQuery indexQuery = new IndexQueryBuilder().withObject(book).build();elasticsearchTemplate.index(indexQuery);}@Testpublic void testElasticsearchTemplateSearch() {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new MatchQueryBuilder("name", "國")).build();List<Book> books = elasticsearchTemplate.queryForList(searchQuery,Book.class);System.out.println(books);} }
  • 先執行存儲文檔方法成功后,再執行檢索方法結果正確。

更多詳細信息參考官方文檔

總結

以上是生活随笔為你收集整理的springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。