javascript
springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch
一、Elasticsearch概念
?以 員工文檔 的形式存儲為例:一個文檔代表一個員工數據。存儲數據到 ElasticSearch 的行為叫做 索引 ,但在索引一個文檔之前,需要確定將文檔存儲在哪里。
?一個 ElasticSearch 集群可以 包含多個 索引 ,相應的每個索引可以包含多個 類型 。 這些不同的類型存儲著多個 文檔 ,每個文檔又有 多個 屬性 。
?類似關系:
–索引-數據庫
–類型-表
–文檔-表中的記錄
–屬性-列
更多詳細內容見官方文檔
二、Elasticsearch入門
2.1、安裝Elasticsearch
1、在虛擬機中通過Docker拉取elasticsearch鏡像
docker pull elasticsearch2、運行鏡像并使其運行成容器(9200是暴露給web端的,9300是在分布式系統中各個節點交互暴露的接口)
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name my_es 5acf0e8da90b3、拷貝配置文件到宿主機(必須保證容器中的ES是啟動狀態)
從這步開始一定要跟著做,不然后面使用SpringData的接口操作時會報錯。詳細見ARTS第三周
docker cp my_es:/usr/share/elasticsearch/config/elasticsearch.yml: /usr/share/elasticsearch.yml4、停止 和 刪除原來創建的容器
docker stop elasticsearch docker rm my_es5、重新執行創建容器命令(重點:掛載文件)
docker run -di --name=my_es -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch6、 修改 /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
- application.properties
- 測試類
- 先執行存儲文檔方法沒問題,然后再執行檢索方法,結果正確
更多詳細信息參考官方文檔
3.3、SpringData的接口操作ES
- maven依賴
- Book.java
- BookRepository.java
- application.properties
cluster-name可通過訪問ip:9200獲取
- 測試類
- 先執行存儲方法沒問題,然后執行檢索方法,結果正確。
3.4、ElasticsearchTemplate操作ES
用的還是上面的環境
- 測試類
- 先執行存儲文檔方法成功后,再執行檢索方法結果正確。
更多詳細信息參考官方文檔
總結
以上是生活随笔為你收集整理的springboot整合elasticsearch_Spring Boot学习10_整合Elasticsearch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016光大爱心信用卡额度一般是多少
- 下一篇: Spring AOP编程问题:下面代码哪