ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式的全文搜索引擎,其對外服務是基於RESTful web接口發佈的。Elasticsearch是用Java開發的應用,並做爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,可以達到近實時搜索,穩定,可靠,快速,安裝使用方便。java
cluster集羣。ElasticSearch集羣由一或多個節點組成,其中有一個主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的。ElasticSearch的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部看ElasticSearch集羣,在邏輯上是個總體,你與集羣中的任何一個節點通訊和與整個ElasticSearch集羣通訊是等價的。也就是說,主節點的存在不會產生單點安全隱患、併發訪問瓶頸等問題。node
primary shard:表明索引的主分片,ElasticSearch能夠把一個完整的索引分紅多個primary shard,這樣的好處是能夠把一個大的索引拆分紅多個分片,分佈存儲在不一樣的ElasticSearch節點上,從而造成分佈式存儲,併爲搜索訪問提供分佈式服務,提升併發處理能力。primary shard的數量只能在索引建立時指定,而且索引建立後不能再更改primary shard數量(從新分片須要從新定義分片規則)。es5.x以後默認爲5,es7.x默認爲1。程序員
replica shard:表明索引主分片的副本,ElasticSearch能夠設置多個replica shard。replica shard的做用:一是提升系統的容錯性,當某個節點某個primary shard損壞或丟失時能夠從副本中恢復。二是提升ElasticSearch的查詢效率,ElasticSearch會自動對搜索請求進行負載均衡,將併發的搜索請求發送給合適的節點,加強併發處理能力。可取值爲0~n,默認爲1。web
索引。至關於關係型數據庫中的表。其中存儲若干類似結構的Document數據。如:客戶索引,訂單索引,商品索引等。ElasticSearch中的索引不像數據庫表格同樣有強制的數據結構約束,在理論上,能夠存儲任意結構的數據。但了爲更好的爲業務提供搜索數據支撐,仍是要設計合適的索引體系來存儲不一樣的數據。數據庫
類型。每一個索引中都必須有惟一的一個Type,Type是Index中的一個邏輯分類。ElasticSearch中的數據Document是存儲在索引下的Type中的。json
注意:ElasticSearch5.x及更低版本中,一個Index中能夠有多個Type。ElasticSearch6.x版本以後,type概念被弱化,一個index中只能有惟一的一個type。且在7.x版本以後,刪除type定義。api
文檔。ElasticSearch中的最小數據單元。一個Document就是一條數據,通常使用JSON數據結構表示。每一個Index下的Type中均可以存儲多個Document。一個Document中可定義多個field,field就是數據字段。如:學生數據({"name":"張三", "age":20, "gender":"男"})。數組
對數據進行分析,抽取出數據中的詞條,以詞條做爲key,對應數據的存儲位置做爲value,實現索引的存儲。這種索引稱爲倒排索引。倒排索引是Document寫入ElasticSearch時分析維護的。安全
3,比數據庫作搜索的優點服務器
GET _cat/health?v
其中status的狀態分爲三種:green、yellow和red
#查看健康狀態 GET _cat/health?v #查看節點信息 GET _cat/nodes?v #查看索引信息 GET _cat/indices?v #查看分片信息 GET _cat/shards?v
#建立my_index索引(settings能夠省略),建立後shards分片數不能修改,只能修改shards副本數 PUT my_index { "settings": { "number_of_shards": 5, "number_of_replicas": 1 } }
在ElasticSearch中,默認的建立索引的時候,會分配5個primary shard,併爲每一個primary shard分配一個replica shard(在ES7版本後,默認建立1個primary shard)。在ElasticSearch中,默認的限制是:若是磁盤空間不足15%的時候,不分配replica shard。若是磁盤空間不足5%的時候,再也不分配任何的primary shard。ElasticSearch中對shard的分佈是有要求的。ElasticSearch儘量保證primary shard平均分佈在多個節點上。Replica shard會保證不和他備份的那個primary shard分配在同一個節點上。
#修改索引 PUT my_index/_settings { "number_of_replicas": 2 }
注意:索引一旦建立,primary shard數量不可變化,能夠改變replica shard數量。
DELETE my_index
GET _cat/indices?v
在索引中增長文檔。在index中增長document。
ElasticSearch有自動識別機制。若是增長的document對應的index不存在,自動建立index;若是index存在,type不存在,則自動建立type。若是index和type都存在,則使用現有的index和type。
PUT 索引名/類型名/惟一ID{字段名:字段值}
#若是當前id已經存在,那麼就是修改,若是不存在就是新增
PUT my_index/_doc/1 { "name":"test_doc_01", "remark":"first test elastic search", "order_no":1 }
若是當前索引中的document的id已經存在,那麼就是修改,若是不存在就是新增。可是若是此時id已經存在,想要強制新增會報錯,強制新增的語法爲:
PUT 索引名/類型名/惟一ID/_create{字段名:字段值} 或者是 PUT 索引名/類型名/惟一ID?op_type=create{字段名:字段值}
此操做爲ElasticSearch自動生成id的新增Document方式。此語法格式和PUT請求的數據新增,只有惟一的區別,就是能夠自動生成主鍵id,其餘的和PUT請求新增數據徹底一致。
POST 索引名/類型名[/惟一ID]{字段名:字段值}
#此時,若是新增時惟一id(2)不存在就是新增,若是惟一id(2)存在就是修改。這個與PUT相同
#能夠直接變爲沒有id,會隨機生成一個GUID做爲id
POST my_index/_doc { "name":"test_doc_02", "remark":"second test elastic search", "order_no":2 }
GET 索引名/類型名/惟一ID
GET my_index/_doc/1
批量查詢能夠提升查詢效率。推薦使用(相對於單數據查詢來講)。
#語法 GET 索引名/類型名/_mget { "docs" : [ { "_id" : "惟一ID值" }, { "_id" : "惟一ID值" } ] }
PUT|POST 索引名/類型名/惟一ID{字段名:字段值}
本操做至關於覆蓋操做。全量替換的過程當中,ElasticSearch不會真的修改Document中的數據,而是標記ElasticSearch中原有的Document爲deleted狀態,再建立一個新的Document來存儲數據,當ElasticSearch中的數據量過大時,ElasticSearch後臺回收deleted狀態的Document。
PUT my_index/_doc/1 { "name":"test_doc_01111", "remark":"first 111", "order_no":1111 }
POST 索引名/類型名/惟一ID/_update{doc:{字段名:字段值}}
只更新某Document中的部分字段。這種更新方式也是標記原有數據爲deleted狀態,建立一個新的Document數據,將新的字段和未更新的原有字段組成這個新的Document,並建立。對比全量替換而言,只是操做上的方便,在底層執行上幾乎沒有區別。
POST my_index/_doc/1/_update { "doc":{ "name":" test_doc_01_for_update" } }
DELETE 索引名/類型名/惟一ID
ElasticSearch中執行刪除操做時,ElasticSearch先標記Document爲deleted狀態,而不是直接物理刪除。當ElasticSearch存儲空間不足或工做空閒時,纔會執行物理刪除操做。標記爲deleted狀態的數據不會被查詢搜索到。
DELETE my_index/_doc/2
定義:
POST _bulk { "action_type" : { "metadata_name" : "metadata_value" } } { document datas | action datas } action_type: create: 強制建立,至關於PUT 索引名/類型名/惟一ID/_create index : 普通的PUT操做,至關於建立Document或全量替換 update: 更新操做(partial update),至關於 POST 索引名/類型名/惟一ID/_update delete: 刪除操做
案例:
#若是index和type爲同一個能夠提出來,此時建立ID爲111,覆蓋ID爲1,修改ID爲2,刪除ID爲3 POST my_index/_doc/_bulk {"create":{"_id":111}} {"name":"zs","age":15} {"index":{"_id":1}} {"name":"first","sort":1} {"update":{"_id":2}} {"doc":{"sort":2}} {"delete":{"_id":3}}
注意:bulk語法中要求一個完整的json串不能有換行。不一樣的json串必須使用換行分隔。多個操做中,若是有錯誤狀況,不會影響到其餘的操做,只會在批量操做返回結果中標記失敗。bulk語法批量操做時,bulk request會一次性加載到內存中,若是請求數據量太大,性能反而降低(內存壓力太高),須要反覆嘗試一個最佳的bulk request size。通常從1000~5000條數據開始嘗試,逐漸增長。若是查看bulk request size的話,通常是5~15MB之間爲好。
bulk語法要求json格式是爲了對內存的方便管理,和儘量下降內存的壓力。若是json格式沒有特殊的限制,ElasticSearch在解釋bulk請求時,須要對任意格式的json進行解釋處理,須要對bulk請求數據作json對象會json array對象的轉化,那麼內存的佔用量至少翻倍,當請求量過大的時候,對內存的壓力會直線上升,且須要jvm gc進程對垃圾數據作頻繁回收,影響ElasticSearch效率。
生成環境中,bulk api經常使用。都是使用java代碼實現循環操做。通常一次bulk請求,執行一種操做。如:批量新增10000條數據等。
Mapping在ElasticSearch中是很是重要的一個概念。決定了一個index中的field使用什麼數據格式存儲,使用什麼分詞器解析,是否有子字段等。
在上述的自動mapping字段類型分配的時候,只有text類型的字段須要分詞器。默認分詞器是standard分詞器。
GET 索引名/_mapping
{ "my_index": { # 索引名 "mappings": { # 映射列表 "my_type": { # 類型名 "properties": { # 字段列表 "age": { # 字段名 "type": "long" # 字段類型 }, "gender": { #字段名 "type": "text", #字段類型 "fields": { # 子字段列表 "keyword": { # 子字段名 "type": "keyword", # 子字段類型,keyword不進行分詞處理的文本類型。gender.keyword能夠進行排序 "ignore_above": 256 # 子字段存儲數據長度 } } } } } } } }
能夠經過命令,在建立index和type的時候來定製mapping映射,也就是指定字段的類型和字段數據使用的分詞器。
手工定製mapping時,只能新增mapping設置,不能對已有的mapping進行修改。
如:有索引a,其中有類型b,增長字段f1的mapping定義。後續能夠增長字段f2的mapping定義,可是不能修改f1字段的mapping定義。
PUT 索引名稱 { "mappings":{ "類型名稱":{ "properties":{ "字段名":{ "type":類型, ["analyer":字段的分詞器,] ["fields":{ "子字段名稱":{ "type":類型, "ignore_above":長度限制 } }] } } } } }
例如:
PUT test_index { "settings": { "number_of_shards": 2, "number_of_replicas": 1 }, "mappings": { "test_type":{ "properties": { "author_id" : { "type": "byte", "index": false }, "title" : { "type": "text", "analyzer": "ik_max_word", "fields": { "keyword" : { "type": "keyword", "ignore_above": 256 } } }, "content" : { "type": "text", "analyzer": "ik_max_word" }, "post_date" : { "type": "date" } } } } } "index" - 是否能夠做爲搜索索引。可選值:true | false "analyzer" - 指定分詞器。 "type" - 指定字段類型
PUT 索引名/_mapping/類型名 { "properties":{ "新字段名":{ "type":類型, "analyer":字段的分詞器, "fields":{ "子字段名":{ "type":類型, "ignore_above":長度 } } } }
例如:
PUT /test_index/_mapping/test_type { "properties" : { "new_field" : { "type" : "text" , "analyzer" : "standard" } } }
GET 索引名稱/_analyze { "field":"索引中的text類型的字段名", "text":"要分詞處理的文本數據" }
例如:
#測試content字段的分詞效果
GET test_index/_analyze { "field": "content", "text": "我是一個程序員" }