ElasticSearch簡介
什么是ElasticSearch
ElaticSearch,簡稱為ES, ES是一個開源的高擴展的分布式全文檢索引擎,它可以近乎實時的存盤、檢索資料;本身擴展性很好,可以擴展到上百臺服務器,處理PB級別的資料,ES也使用Java開發并使用Lucene作為其核心來實作所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變得簡單,
ElasticSearch對比Solr
①Solr利用Zookeeper進行分布式管理,而Elasticsearch自身帶有分布式協調管理功能,
②Solr支持更多格式的資料,而Elasticsearch僅支持json檔案格式,
③Solr官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高級功能多有第三方插件提供,
④Solr在傳統的搜索應用中表現好于Elasticsearch,但在處理實時搜索應用時效率明顯低于Elasticsearch,
ElasticSearch的安裝
Windows下安裝ElasticSearch
①下載ElasticSearch安裝包

②解壓ElasticSearch安裝包,目錄結構如下圖

③修改ElasticSearch的組態檔:./config/elasticsearch.yml,增加以下兩句命令
# 允許elasticsearch跨越訪問,如果不安裝elasticsearch-head,是可以不修改組態檔,直接啟動, http.cors.enabled: true http.cors.allow-origin: "*"
④啟動ElasticSearch服務:./bin/elasticsearch.bat,控制臺顯示日志資訊如下

ElasticSearch會使用兩個埠9300和9200,9300是TCP通訊埠,集群間和TCPClient都執行該埠,9200是HTTP協議的RESTful介面
⑤通過瀏覽器訪問ElasticSearch服務器,看到如下回傳的json資訊,代表服務啟動成功

安裝ElasticSearch的圖形化界面插件
簡介
ElasticSearch不同于Solr自帶圖形化界面,可以通過安裝ElasticSearch的head插件,完成圖形化界面的效果,完成索引資料的查看,安裝插件的方式有兩種,在線安裝和本地安裝,elasticsearch-5-*以上版本安裝elasticsearch-head需要安裝node和grunt
安裝步驟
①下載elasticsearch-head-master

②解壓elasticsearch-head-master安裝包,目錄結構如下圖

③下載nodejs,安裝步驟略過,安裝完成后,在DOS視窗查看是否安裝成功,使用命令:node -v,出現如下截圖,則說明安裝成功

④安裝grunt,在node安裝路徑下,使用命令安裝:npm install -g grunt-cli安裝grunt,安裝結束后,使用命令grunt -version查看是否安裝成功出現如下截圖,則說明安裝成功

⑤在DOS視窗進入到elasticsearch-head-master路徑下,使用命令npm install安裝pathomjs

⑥啟動服務,使用命令:npm start啟用服務,出現如下截圖,則說明服務啟動成功

⑦瀏覽器訪問:localhost:9100,出現如下截圖,則說明elasticsearch-head安裝成功,默認埠是9100

ElasticSearch相關概念
概述
Elasticsearch是面向檔案(document oriented)的,這意味著它可以存盤整個物件或檔案(document),然而它不僅僅是存盤,還會索引(index)每個檔案的內容使之可以被搜索,在Elasticsearch中,你可以對檔案(而非成行成列的資料)進行索引、搜索、排序、過濾,Elasticsearch對比傳統關系型資料庫如下:
| Relational DB | Elasticsearch |
|---|---|
| Databases | Indices |
| Tables | Types |
| Rows | Documents |
| Columns | Fields |
Elasticsearch核心概念
索引(index)
一個索引就是一個擁有幾分相似特征的檔案的集合,比如說,你可以有一個客戶資料的索引,另一個產品目錄的索引,還有一個訂單資料的索引,一個索引由一個名字來標識(必須全部是小寫字母的),并且當我們要對對應于這個索引中的檔案進行索引、搜索、更新和洗掉的時候,都要使用到這個名字,在一個集群中,可以定義任意多的索引,
型別(type)
在一個索引中,你可以定義一種或多種型別,一個型別是你的索引的一個邏輯上的分類/磁區,其語意完全由你來定,通常,會為具有一組共同欄位的檔案定義一個型別,比如說,我們假設你運營一個博客平臺并且將你所有的資料存盤到一個索引中,在這個索引中,你可以為用戶資料定義一個型別,為博客資料定義另一個型別,當然,也可以為評論資料定義另一個型別,
欄位(field)
相當于是資料表的欄位,對檔案資料根據不同屬性進行的分類標識,
映射(mapping)
mapping是處理資料的方式和規則方面做一些限制,如某個欄位的資料型別、默認值、分析器、是否被索引等等,這些都是映射里面可以設定的,其它就是處理es里面資料的一些使用規則設定也叫做映射,按著最優規則處理資料對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好,
檔案(document)
一個檔案是一個可被索引的基礎資訊單元,比如,你可以擁有某一個客戶的檔案,某一個產品的一個檔案,當然,也可以擁有某個訂單的一個檔案,檔案以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網資料互動格式,
在一個index/type里面,你可以存盤任意多的檔案,注意,盡管一個檔案,物理上存在于一個索引之中,檔案必須被索引/賦予一個索引的type,
接近實時(NRT)
ElasticSearch是一個接近實時的搜索平臺,這意味著,從索引一個檔案直到這個檔案能夠被搜索到有一個輕微的延遲(通常是1秒以內),
集群(cluster)
一個集群就是由一個或多個節點組織在一起,它們共同持有整個的資料,并一起提供索引和搜索功能,一個集群由一個唯一的名字標識,這個名字默認就是“elasticsearch”,這個名字是重要的,因為一個節點只能通過指定某個集群的名字,來加入這個集群,
節點(node)
一個節點是集群中的一個服務器,作為集群的一部分,它存盤資料,參與集群的索引和搜索功能,和集群類似,一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點,這個名字對于管理作業來說挺重要的,因為在這個管理程序中,你會去確定網路中的哪些服務器對應于ElasticSearch集群中的哪些節點,
一個節點可以通過配置集群名稱的方式來加入一個指定的集群,默認情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的集群中,這意味著,如果你在你的網路中啟動了若干個節點,并假定它們能夠相互發現彼此,它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中,
在一個集群里,只要你想,可以擁有任意多個節點,而且,如果當前你的網路中沒有運行任何Elasticsearch節點,這時啟動一個節點,會默認創建并加入一個叫做“elasticsearch”的集群,
分片和復制(shards&replicas)
一個索引可以存盤超出單個結點硬體限制的大量資料,比如,一個具有10億檔案的索引占據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,回應太慢,為了解決這個問題,ElasticSearch提供了將索引劃分成多份的能力,這些份就叫做分片,當你創建一個索引的時候,你可以指定你想要的分片的數量,每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上,
分片很重要,主要有兩方面的原因:
1)允許你水平分割/擴展你的內容容量,
2)允許你在分片(潛在地,位于多個節點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量,
至于一個分片怎樣分布,它的檔案怎樣聚合回搜索請求,是完全由ElasticSearch管理的,對于作為用戶的你來說,這些都是透明的,
在一個網路/云的環境里,失敗隨時都可能發生,在某個分片/節點不知怎么的就處于離線狀態,或者由于任何原因消失了,這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的,為此目的,ElasticSearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制,
復制之所以重要,有兩個主要原因: 在分片/節點失敗的情況下,提供了高可用性,因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置于同一節點上是非常重要的,擴展你的搜索量/吞吐量,因為搜索可以在所有的復制上并行運行,總之,每個索引可以被分成多個分片,一個索引也可以被復制0次(意思是沒有復制)或多次,一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別,分片和復制的數量可以在索引創建的時候指定,在索引創建之后,你可以在任何時候動態地改變復制的數量,但是你事后不能改變分片的數量,
默認情況下,ElasticSearch中的每個索引被分片5個主分片和1個復制,這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片,
ElasticSearch的客戶端操作
實際開發中,主要有三種方式可以作為ElasticSearch服務的客戶端,
第一種:使用elasticsearch-head插件,
第二種:使用ElasticSearch提供的Restful介面直接訪問,
第三種:使用ElasticSearch提供的API進行訪問,
Postman概述
Postman是款強大網頁除錯工具的windows客戶端,提供功能強大的Web API & HTTP 請求除錯,軟體功能非常強大,界面簡潔明晰、操作方便快捷,設計得很人性化,Postman中文版能夠發送任何型別的HTTP請求 (GET、HEAD、POST、PUT等),且可以附帶任何數量的引數,
Postman安裝步驟
①下載Postman
②雙擊安裝即可
使用Postman進行Restful訪問(DSL陳述句)
ElasticSearch的介面語法
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
| 引數 | 說明 |
|---|---|
| VERB | 適當的HTTP方法或謂詞:GET、POST、PUT、HEAD 或者DELETE |
| PROTOCOL | http或者https(如果你在ElasticSearch前面有一個https代理) |
| HOST | ElasticSearch集群中任意節點的主機名,或者用localhost代表本地機器上的節點 |
| PORT | 運行ElasticSearch的HTTP服務的埠號,默認是 9200 |
| PATH | API的終端路徑(例如_count將回傳集群中檔案數量),Path可能包含多個組件,例如:_cluster/stats 和_nodes/stats/jvm |
| QUERY_STRING | 任意可選的查詢字串引數(例如pretty將格式化地輸出JSON回傳值,使其更容易閱讀) |
| BODY | 一個JSON格式的請求體 (如果請求需要的話) |
創建索引庫時映射
請求url
PUT localhost:9200/blog
請求體
{ "mappings":{ "article":{ "properties":{ "id":{ "type":"long", "store":true }, "title":{ "type":"text", "store":true, "index":true, "analyzer":"standard" }, "content":{ "type":"text", "store":true, "index":true, "analyzer":"standard" } } } } }
執行成功回傳的資料
{ "acknowledged": true, "shards_acknowledged": true, "index": "blog" }
創建索引庫
請求url
PUT localhost:9200/blog1
請求體:無
執行成功回傳的資料
{ "acknowledged": true, "shards_acknowledged": true, "index": "blog1" }
設定映射
請求url
POST http://localhost:9200/blog1/hello/_mappings
請求體
{ "hello":{ "properties":{ "id":{ "type":"long", "store":true }, "title":{ "type":"text", "store":true, "index":true, "analyzer":"standard" }, "content":{ "type":"text", "store":true, "index":true, "analyzer":"standard" } } } }
執行成功回傳的資料
{ "acknowledged": true }
洗掉索引庫
請求url
DELETE http://localhost:9200/blog1
請求引數:無
執行成功回傳的資料
{ "acknowledged": true }
向索引庫中添加檔案
請求url
POST http://localhost:9200/blog/article/1
請求引數
{ "id": 1, "title": "ElasticSearch是一個基于Lucene的搜索服務器", "content": "它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web介面,Elasticsearch是用Java開發的,并作為Apache許可條款下的開放原始碼發布,是當前流行的企業級搜索引擎,設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便," }
執行成功回傳的資料
{ "_index": "blog", "_type": "article", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true }
修改檔案
請求url
POST http://localhost:9200/blog/article/1
請求引數
{ "id": 1, "title": "【修改】ElasticSearch是一個基于Lucene的搜索服務器", "content": "【修改】它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web介面,Elasticsearch是用Java開發的,并作為Apache許可條款下的開放原始碼發布,是當前流行的企業級搜索引擎,設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便," }
執行成功回傳的資料
{ "_index": "blog", "_type": "article", "_id": "1", "_version": 2, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": false }
洗掉檔案
請求url
DELETE http://localhost:9200/blog/article/1
請求引數:無
執行成功回傳的資料
{ "found": true, "_index": "blog", "_type": "article", "_id": "1", "_version": 3, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 } }
查詢檔案
準備資料
①創建商品索引庫與映射
# 請求url PUT http://localhost:9200/goods # 請求引數 { "mappings": { "mobile_phone": { "properties": { "id": { "type": "long", "store": true, "index": "not_analyzed" }, "title": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" }, "content": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" } } } } } # 執行成功回傳的資料 { "acknowledged": true, "shards_acknowledged": true, "index": "goods" }
②向商品索引庫內添加檔案
# 添加檔案1 # 請求url POST http://localhost:9200/goods/mobile_phone/1 # 請求引數 { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } # 執行成功回傳的資料 { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true } # 添加檔案2 # 請求url POST http://localhost:9200/goods/mobile_phone/2 # 請求引數 { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } # 執行成功回傳的資料 { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true } # 添加檔案3 # 請求url POST http://localhost:9200/goods/mobile_phone/3 # 請求引數 { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } # 執行成功回傳的資料 { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true } # 添加檔案4 # 請求url POST http://localhost:9200/goods/mobile_phone/4 # 請求引數 { "id": 4, "title": "華為p30", "content": "麒麟980AI智能芯片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通," } # 執行成功回傳的資料 { "_index": "goods", "_type": "mobile_phone", "_id": "4", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true } # 添加檔案5 # 請求url POST http://localhost:9200/goods/mobile_phone/5 # 請求引數 { "id": 5, "title": "華為筆記本", "content": "筆記本電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深慷訓," } # 執行成功回傳的資料 { "_index": "goods", "_type": "mobile_phone", "_id": "5", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true }
方式一:根據ID查詢
請求url
GET http://localhost:9200/goods/mobile_phone/1
請求引數:無
執行成功回傳的資料
{ "_index": "goods", "_type": "mobile_phone", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }
方式二:querystring查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query":{ "query_string":{ "default_field":"title", "query":"小米" } } }
執行成功回傳的資料
{ "took": 15, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 1.219939, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 1.219939, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 0.5063205, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 0.25316024, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] } }
方式三:trem查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query": { "term": { "title": "米" } } }
執行成功回傳的資料
{ "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0.6099695, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 0.6099695, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 0.25316024, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 0.25316024, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] } }
方式四:fuzzy查詢(模糊查詢)
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query": { "fuzzy": { "title": "米" } } }
執行成功回傳的資料
{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0.6099695, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 0.6099695, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 0.25316024, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 0.25316024, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] } }
過濾后查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query":{ "bool":{ "filter":{ "term":{ "title":"8" } }, "must":[ { "match":{ "title":"米" } } ] } } }
執行成功回傳的資料
{ "took": 12, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.25316024, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 0.25316024, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } } ] } }
查詢后過濾
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query":{ "match":{ "title":"米" } }, "post_filter":{ "term":{ "title":"8" } } }
執行成功回傳的資料
{ "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.25316024, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 0.25316024, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } } ] } }
分頁查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query": { "match_all": {} }, "from": 1, "size": 1 }
執行成功回傳的資料
{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, "max_score": 1.0, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 1.0, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } } ] } }
投影查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query": { "match_all": {} }, "_source": [ "title", "content" ] }
執行成功回傳的資料
{ "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, "max_score": 1.0, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "5", "_score": 1.0, "_source": { "title": "華為筆記本", "content": "筆記本電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深慷訓," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 1.0, "_source": { "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } }, { "_index": "goods", "_type": "mobile_phone", "_id": "4", "_score": 1.0, "_source": { "title": "華為p30", "content": "麒麟980AI智能芯片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 1.0, "_source": { "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 1.0, "_source": { "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] } }
多值查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_mget
請求引數
{ "ids": [2,1,3] }
執行成功回傳的資料
{ "docs": [ { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_version": 1, "found": true, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_version": 1, "found": true, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] }
高亮查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query": { "match": { "title": "蝦米" } }, "highlight": { "fields": { "title": {} }, "pre_tags": [ "<span style='color:red'>" ], "post_tags": [ "</span>" ] } }
執行成功回傳的資料
{ "took": 35, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0.6099695, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 0.6099695, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" }, "highlight": { "title": [ "小<span style='color:red'>米</span>10" ] } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 0.25316024, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," }, "highlight": { "title": [ "小<span style='color:red'>米</span>8" ] } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 0.25316024, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" }, "highlight": { "title": [ "紅<span style='color:red'>米</span>k30" ] } } ] } }
聚合查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "aggs": { "MyOwnGroupBy": { "terms": { "field": "title.keyword", "size": 10 } } } }
執行成功回傳的資料
{ "took": 16, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, "max_score": 1.0, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "5", "_score": 1.0, "_source": { "id": 5, "title": "華為筆記本", "content": "筆記本電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深慷訓," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": 1.0, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" } }, { "_index": "goods", "_type": "mobile_phone", "_id": "4", "_score": 1.0, "_source": { "id": 4, "title": "華為p30", "content": "麒麟980AI智能芯片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": 1.0, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," } }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 1.0, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] }, "aggregations": { "MyOwnGroupBy": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [] } } }
區間查詢
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "query": { "bool": { "filter": { "range": { "id": { "gt": 2, "lt": 4 } } } } } }
執行成功回傳的資料
{ "took": 12, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.0, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": 0.0, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" } } ] } }
排序
請求url
GET http://localhost:9200/goods/mobile_phone/_search
請求引數
{ "sort": [ { "id": { "order": "desc" } } ] }
執行成功回傳的資料
{ "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, "max_score": null, "hits": [ { "_index": "goods", "_type": "mobile_phone", "_id": "5", "_score": null, "_source": { "id": 5, "title": "華為筆記本", "content": "筆記本電腦MateBook 14,2020款銳龍版,14英寸,R5,4600H,16G+512G,2K觸控全面屏,多屏協同,輕薄本,深慷訓," }, "sort": [ 5 ] }, { "_index": "goods", "_type": "mobile_phone", "_id": "4", "_score": null, "_source": { "id": 4, "title": "華為p30", "content": "麒麟980AI智能芯片,感光徠卡三攝,全面屏屏內指紋版,天空之境,8GB+128GB,全網通," }, "sort": [ 4 ] }, { "_index": "goods", "_type": "mobile_phone", "_id": "3", "_score": null, "_source": { "id": 3, "title": "紅米k30", "content": "王一博同款,120Hz流速屏,前置挖孔雙攝,索尼6400萬后置四攝,4500mAh超長續航,27W快充,6GB+128GB 紫玉幻境,游戲智能手機" }, "sort": [ 3 ] }, { "_index": "goods", "_type": "mobile_phone", "_id": "2", "_score": null, "_source": { "id": 2, "title": "小米10", "content": "小米10旗艦產品,尊享白條分期12期免息,驍龍865處理器【小米10至尊版限時搶購中!點擊直達】" }, "sort": [ 2 ] }, { "_index": "goods", "_type": "mobile_phone", "_id": "1", "_score": null, "_source": { "id": 1, "title": "小米8", "content": "【螢屏指紋版/后指紋可選】購機贈:高品質音樂耳機+手環支架+一拖三資料線(蘋果安卓通用)+運費險+本店質保一年;全國聯保+廠家直供小米8se到手價1299," }, "sort": [ 1 ] } ] } }
中文分詞器
標準分詞器效果測驗
請求url
GET http://localhost:9200/_analyze?analyzer=standard&pretty=true&text=我是程式員
執行成功回傳的資料
{ "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>", "position": 1 }, { "token": "程", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>", "position": 2 }, { "token": "序", "start_offset": 3, "end_offset": 4, "type": "<IDEOGRAPHIC>", "position": 3 }, { "token": "員", "start_offset": 4, "end_offset": 5, "type": "<IDEOGRAPHIC>", "position": 4 } ] }
經過測驗發現,標準分詞器分詞結果并不是我們想要的效果,我們想要的效果是:我、是、程式、程式員,
這樣的話就需要對中文支持良好的分析器的支持,支持中文分詞的分詞器有很多,比如:IK分詞器、word分詞器、庖丁解牛、盤古分詞、Ansj分詞等,但我們常用的是IK分詞器,
IK分詞器簡介
IKAnalyzer是一個開源的,基于java語言開發的輕量級的中文分詞工具包,從2006年12月推出1.0版開始,IKAnalyzer已經推出 了3個大版本,最初,它是以開源專案Lucene為應用主體的,結合詞典分詞和文法分析演算法的中文分詞組件,新版本的IKAnalyzer3.0則發展為 面向Java的公用分詞組件,獨立于Lucene專案,同時提供了對Lucene的默認優化實作,
IK分詞器3.0的特性如下:
①采用了特有的“正向迭代最細粒度切分演算法“,具有60萬字/秒的高速處理能力,
②采用了多子處理器分析模式,支持:英文字母(IP地址、Email、URL)、數字(日期,常用中文數量詞,羅馬數字,科學計數法),中文詞匯(姓名、地名處理)等分詞處理,
③對中英聯合支持不是很好,在這方面的處理比較麻煩.需再做一次查詢,同時是支持個人詞條的優化的詞典存盤,更小的記憶體占用,
④支持用戶詞典擴展定義,
⑤針對Lucene全文檢索優化的查詢分析器IKQueryParser;采用歧義分析演算法優化查詢關鍵字的搜索排列組合,能極大的提高Lucene檢索的命中率,
ElasticSearch集成IK分詞器的步驟
①訪問:http://localhost:9200,查看ElasticSearch版本

②下載IK分詞器,對應版本

③解壓,將解壓后的檔案夾拷貝到./plugins下,并重命名檔案夾為analysis-ik,目錄結構如下圖

④重新啟動ElasticSearch,即可加載IK分詞器

IK分詞器效果測驗
IK提供了兩個分詞演算法ik_smart和ik_max_word,其中 ik_smart為最少切分,ik_max_word為最細粒度切分,
最少切分ik_smart
請求url
GET http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程式員
執行成功回傳的資料
{ "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "程式員", "start_offset": 2, "end_offset": 5, "type": "CN_WORD", "position": 2 } ] }
最細力度切分ik_max_word
請求urlGET http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程式員
執行成功回傳的引數
{ "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "程式員", "start_offset": 2, "end_offset": 5, "type": "CN_WORD", "position": 2 }, { "token": "程式", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 3 }, { "token": "員", "start_offset": 4, "end_offset": 5, "type": "CN_CHAR", "position": 4 } ] }
ElasticSearch集群
簡介
ES集群是一個 P2P型別(使用gossip協議)的分布式系統,除了集群狀態管理以外,其他所有的請求都可以發送到集群內任意一臺節點上,這個節點可以自己找到需要轉發給哪些節點,并且直接跟這些節點通信,所以,從網路架構及服務配置上來說,構建集群所需要的配置極其簡單,在ElasticSearch 2.0 之前,無阻礙的網路下,所有配置了相同cluster.name的節點都自動歸屬到一個集群中,2.0 版本之后,基于安全的考慮避免開發環境過于隨便造成的麻煩,從 2.0 版本開始,默認的自動發現方式改為了單播(unicast)方式,配置里提供幾臺節點的地址,ElasticSearch將其視作gossip router角色,借以完成集群的發現,由于這只是ElasticSearch內一個很小的功能,所以gossip router角色并不需要單獨配置,每個ElasticSearch節點都可以擔任,所以,采用單播方式的集群,各節點都配置相同的幾個節點串列作為router即可,
集群中節點數量沒有限制,一般大于等于2個節點就可以看做是集群了,一般處于高性能及高可用方面來考慮一般集群中的節點數量都是3個及3個以上,
集群的搭建
①準備三臺ElasticSearch服務器:創建elasticsearch-cluster檔案夾,在內部復制三個elasticsearch服務
②修改每臺服務器配置:修改elasticsearch-cluster\node*\config\elasticsearch.yml組態檔
#節點1的配置資訊: #集群名稱,保證唯一 cluster.name: my-elasticsearch #節點名稱,必須不一樣 node.name: node-1 #必須為本機的ip地址 network.host: 127.0.0.1 #服務埠號,在同一機器下必須不一樣 http.port: 9200 #集群間通信埠號,在同一機器下必須不一樣 transport.tcp.port: 9300 #設定集群自動發現機器ip集合 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"] #節點2的配置資訊: #集群名稱,保證唯一 cluster.name: my-elasticsearch #節點名稱,必須不一樣 node.name: node-2 #必須為本機的ip地址 network.host: 127.0.0.1 #服務埠號,在同一機器下必須不一樣 http.port: 9201 #集群間通信埠號,在同一機器下必須不一樣 transport.tcp.port: 9301 #設定集群自動發現機器ip集合 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"] #節點3的配置資訊: #集群名稱,保證唯一 cluster.name: my-elasticsearch #節點名稱,必須不一樣 node.name: node-3 #必須為本機的ip地址 network.host: 127.0.0.1 #服務埠號,在同一機器下必須不一樣 http.port: 9202 #集群間通信埠號,在同一機器下必須不一樣 transport.tcp.port: 9302 #設定集群自動發現機器ip集合 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
③啟動各個節點服務器:雙擊elasticsearch-cluster\node*\bin\elasticsearch.bat
集群測驗
①添加索引和映射
請求url
PUT http://127.0.0.1:9200/test
請求引數
{ "mappings": { "article": { "properties": { "id": { "type": "long", "store": true, "index": "not_analyzed" }, "title": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" }, "content": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" } } } } }
②添加檔案
請求url
POST http://localhost:9200/test/article/1
請求引數
{ "id": 1, "title": "ElasticSearch是一個基于Lucene的搜索服務器", "content": "它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web介面,Elasticsearch是用Java開發的,并作為Apache許可條款下的開放原始碼發布,是當前流行的企業級搜索引擎,設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便," }
③使用elasticsearch-head查看集群情況
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76704.html
標籤:Java
