一搪哪、概念
1.ES基礎(chǔ)概念
? ES是ElasticSearch的縮寫靡努。ES是基于Apache Lucene的開源搜索引擎,是一款實(shí)時分布式搜索和分析引擎晓折,提供RestfulAPI可以進(jìn)行可視化的交互惑朦。具有如下特點(diǎn):
? 1) 提供分布式的實(shí)時文件存儲,每個字段都被索引并可被搜索漓概;
? 2)實(shí)時分析的分布式搜索引擎漾月;
? 3)可以擴(kuò)展到上百萬臺服務(wù)器,能處理PB級結(jié)構(gòu)化或非結(jié)構(gòu)化的數(shù)據(jù)
2.NRT
? NRT是近實(shí)時Near Realtime的縮寫胃珍。ES是一款近實(shí)時的搜索平臺梁肿,即意味著有輕微的延遲,在從開始索引文檔到有結(jié)果的時間稍微延遲通常為1秒堂鲜。
3.ES和SQL
? ES也是一種數(shù)據(jù)庫栈雳,學(xué)習(xí)ES可以對比SQL來理解和學(xué)習(xí)。下面先列出二者的關(guān)系如表-1缔莲,方便讀者有個大概了解哥纫。第二節(jié)會詳細(xì)介紹關(guān)于ES的常用術(shù)語。
二、存儲相關(guān)
1.物理存儲
1)Cluster
? 集群是一個或者一個以上的節(jié)點(diǎn)(服務(wù)器)的集合蛀骇。并在所有節(jié)點(diǎn)上提供聯(lián)合的索引和搜索功能厌秒。集群由唯一的名稱標(biāo)識,默認(rèn)情況下是“elasticsearch”擅憔。該名稱很重要鸵闪,因?yàn)槿绻?jié)點(diǎn)設(shè)置為通過其名稱加入集群,則節(jié)點(diǎn)只能是集群的一部分暑诸。
2)Node
? 節(jié)點(diǎn)是作為集群一部分的單一服務(wù)器蚌讼,存儲您的數(shù)據(jù),并參與集群的索引和搜索功能个榕。就像一個集群一樣篡石,一個節(jié)點(diǎn)由一個名稱來標(biāo)識,默認(rèn)情況下是一個隨機(jī)的通用唯一標(biāo)識符(UUID)西采,它在啟動時分配給該節(jié)點(diǎn)凰萨。所有的節(jié)點(diǎn)通過設(shè)置集群名cluster.name來確定屬于某個集群。
3)Shard
? 由于索引存在存儲可能超過單個節(jié)點(diǎn)的硬件限制的大量數(shù)據(jù)械馆。例如胖眷,占用1TB磁盤空間的10億個文檔的單個索引可能不適合單個節(jié)點(diǎn)的磁盤,或者可能太慢霹崎,無法單獨(dú)從單個節(jié)點(diǎn)提供搜索請求珊搀。因此分片就是為了解決這個問題。每個索引被分成若干個分片仿畸。分片被存儲在不同的節(jié)點(diǎn)中食棕。分片很重要,使用分片的作用:
a) 允許水平分割/縮放內(nèi)容错沽,提高擴(kuò)展能力;
b) 允許在分片(可能在多個節(jié)點(diǎn)上)分布和并行操作眶拉,從而提高性能/吞吐量千埃;
4)Replica
? 副本是分片的復(fù)制。副本的作用:
a) 如果分片/節(jié)點(diǎn)出現(xiàn)故障忆植,則可提供高可用性
b) 允許擴(kuò)展搜索量/吞吐量放可,因?yàn)榭梢詫λ懈北静⑿袌?zhí)行搜索
? 默認(rèn)情默認(rèn)情況下,ElasticSearch中的每個索引都分配了5個主分片和1個副本況下朝刊,ElasticSearch中的每個索引都分配了5個主分片和1個副本耀里。創(chuàng)建索引后,您可以隨時動態(tài)更改副本數(shù)拾氓,但不能更改主分片數(shù)冯挎。
2.邏輯存儲
1)Index
? 索引是具有某種相似特征的文檔的集合。例如咙鞍,您可以擁有客戶數(shù)據(jù)的索引房官,產(chǎn)品目錄的另一個索引趾徽,以及訂單數(shù)據(jù)的另一個索引。索引由名稱(必須全部為小寫)標(biāo)識翰守,該名稱用于在針對其中的文檔執(zhí)行索引孵奶,搜索,更新和刪除操作時引用索引蜡峰。
2)Type
? 類型是您的索引的邏輯類別/分區(qū)了袁,允許您將不同類型的文檔存儲在同一索引中,例如用戶的一種類型湿颅,博客文章的另一種類型早像。在索引中不再可能創(chuàng)建多個類型,并且在以后的版本中將刪除整個類型的概念肖爵。
3)Document
? 文檔是可以索引的基本信息單元卢鹦。例如,您可以為單個客戶提供文檔劝堪,單個產(chǎn)品的文檔冀自,單個訂單的另一個文檔。該文檔以JSON(JavaScript Object Notation)表示秒啦,它是一種無處不在的互聯(lián)網(wǎng)數(shù)據(jù)交換格式熬粗。
4)Field
? 多個字段組成一個文檔。一個索引的所有文檔類型中對于具有相同名稱的字段必須是同一種數(shù)據(jù)類型余境,與SQL SERVER不同驻呐,同一數(shù)據(jù)庫中不同表中相同名稱的列數(shù)據(jù)類型可以不一樣。
5)Mapping
? 映射就是字段即字段和字段類型的對應(yīng)關(guān)系芳来。映射機(jī)制用于進(jìn)行字段類型確認(rèn)含末,將每個字段匹配為一種確定的數(shù)據(jù)類型。例如:字段name即舌,類型是String佣盒;字段age,類型是Integer顽聂。除此之外字段的類型也可以是日期肥惭、布爾值、數(shù)組紊搪、浮點(diǎn)數(shù)蜜葱、對象等等。
三耀石、基礎(chǔ)操作
1.創(chuàng)建
增加一行數(shù)據(jù)牵囤,使用關(guān)鍵字Create。內(nèi)容按照json數(shù)據(jù),可以手動寫奔浅,也可以根據(jù)已知的json格式創(chuàng)建馆纳。
語法模板一:
curl -XPOST localhost:9200/索引名/類型名/'-d'
{"title":"xxxx","text":"xxxx","date":"2014/01/01"}
備注:-d參數(shù)用于將數(shù)據(jù)放在http請求的body中發(fā)送
語法模板二:
curl -XPOST localhost:9200/create_index_action/索引名/類型名/ --data-binary @a.json
備注:依據(jù)據(jù)a.json創(chuàng)建
2.刪除
刪除一行數(shù)據(jù),使用關(guān)鍵字Delete汹桦。
語法模板:
curl -XDELETE localhost:9200/索引名/類型名/ID
備注:ID號一般是自動生成的唯一標(biāo)志符鲁驶,也可以更具需要自定義。
3.修改
修改一行數(shù)據(jù)舞骆,使用關(guān)鍵字Update钥弯。
語法模板:
1)修改某一字段的值
curl -XPOST localhost:9200/索引名/類型名/ID號/_update?pretty
{
"doc":{"name":"wxxq"}
}
2)增加一個字段
curl -XPOST localhost:9200/索引名/類型名/ID號/_update?pretty
{
"doc":{"name":"wxxq","age":18}
}
3)使用腳本修改
curl -XPOST localhost:9200/索引名/類型名/ID號/_update?pretty
{
"script":"ctx._source.age+=5"
}
備注:ctx._source指的是即將更新的當(dāng)前源文檔
4.簡單查詢
查詢數(shù)據(jù),使用關(guān)鍵字Search督禽。
語法模板:
1)空查詢:
? curl -XGET localhost:9200/_search?pretty
? 備注:返回索引中所有的文檔
2)根據(jù)id號來查詢:
? curl -XGET localhost:9200/索引名/類型名/_search?q="_id":"AV4CnR6NuLtuw-m9JsB_"
3)模糊查詢:
? curl -XGET localhost:9200/_all/_search?q="add"
? 備注:查詢有add的文檔
5.批處理
? 批量處理數(shù)據(jù)脆霎,使用關(guān)鍵字bulk。
語法模板:
1)同時修改多個索引
? curl -XPOST localhost:9200/索引名/類型名/_bulk?pretty
? {"index":{"_id":"1"}}
? {"name": "John Doe" }
? {"index":{"_id":"2"}}
? {"name": "Jane Doe" }
2)對多個索引進(jìn)行不同的處理操作
? curl -XPOST localhost:9200/索引名/類型名/_bulk?pretty
? {"update":{"_id":"1"}}
? {"doc": { "name": "John Doe becomes JaneDoe" } }
? {"delete":{"_id":"2"}}
6.搜索結(jié)果釋義
圖-1是一張搜索結(jié)果的截圖狈惫,下面將針對搜索結(jié)果的結(jié)構(gòu)解釋來查看數(shù)據(jù)內(nèi)容睛蛛。
搜索結(jié)果備注:
took:執(zhí)行ES的搜索需要的時間
timed_out:是否超時
_shards:搜索了多少個分片,成功數(shù)量胧谈,失敗數(shù)量
hits:搜索結(jié)果忆肾,通過鍵值對展示
hits.total:符合搜索條件的文件總數(shù)
hits.hits:實(shí)際搜索結(jié)果數(shù)組
_index:該條數(shù)據(jù)所在索引
_type:該條數(shù)據(jù)所在類型
_id:該數(shù)據(jù)的唯一標(biāo)識符
_source:該條數(shù)據(jù)的內(nèi)容,里面由多個fields組成
四菱肖、復(fù)雜查詢
1.多條件查詢
curl -XGET localhost:9200/school/student/_search{
"query":{
"bool":{
? ? ? ? ? ? ? ?"must":[{"match":{"gender":"male"}},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{"match":{"age":18}}],
? ? ? ? ? ? ? "should":["match":{"hobby":"music"}],
? ? ? ? ? ? ? ?"must_not":["match":{"address":"BeiJing"}]
}},
"from":5,
"size":10,
"sort":{"age":{"order":"desc"}}
}
2.過濾器
curl -XGET localhost:9200/school/student/_search{
"query": {
? ? ? ? ? ? ? ?"bool": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"must": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"match_all": {}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"filter": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "range": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "money": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"gte": 20000,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"lte": 30000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? }
?},
"from":5,
"size":10,
"sort":{"age":{"order":"desc"}}
}
備注1:
gt ? ? ? ? ?大于
gte ? ? ? ?大于等于
lt ? ? ? ? ? ?小于
lte ? ? ? ? ?小于等于
備注2:
除了使用range過濾客冈,還可以使用term,terms,exists,missing等
1) term用于精確匹配某些值,如數(shù)字稳强,日期场仲,布爾值
? ?{"term":{"age":20}}
? ?{"term":{"date":"2017-08-21"}}
2) terms與term類似,但允許指定多個匹配條件,當(dāng)某個字段存在多個值時
? ? {"terms":{
? ? ? ? ? ? ? ? ? ? ? "tag":["search","full_text","nosql"]
? ? ? ? ? ? ? ? ? ?}
? ? ? }
3)exists包含某字段
{
? ? ? ? "exists":{
? ? ? ? ? ? ? ? ? ? ? ?"fields":"tittle"
? ? ? ? ? ? ? ? ? ? }
}
4)missing沒有某字段
{
? ? ? ? ?"missing":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "fields":"tittle"
? ? ? ? ? ? ? ? ? ? ? ? }
}
3.聚合
聚合(aggregations)類似于SQL的Group By退疫。
curl -XGET localhost:9200/school/student/_search{
?"size":0,
"aggs":{
"group_by_age":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"range":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"field":"age",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"ranges":[{"from":20,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "to":30},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {"from":30,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"to":40},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{"from":40,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"to":50}]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ?}
? ?}
}
聚合還支持嵌套查詢
curl -XGET localhost:9200/school/student/_search{
"size":0,
"aggs":{
"group_by_age":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"range":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"field":"age",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ranges":[{"from":20,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "to":30},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {"from":30,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "to":40},
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {"from":40,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "to":50}]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? }
},
"aggs":{
? ? ? ? ? ? ? "group_by_gender":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"terms":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "field":"gender"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "aggs":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"avg":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "field":"balance"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ?}?
}