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的配置文件:./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安裝包,目錄結構如下圖
③下載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進行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_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查看集群情況