一、概念
1.ES基礎概念
? ES是ElasticSearch的縮寫。ES是基于Apache Lucene的開源搜索引擎,是一款實時分布式搜索和分析引擎,提供RestfulAPI可以進行可視化的交互。具有如下特點:
? 1) 提供分布式的實時文件存儲,每個字段都被索引并可被搜索;
? 2)實時分析的分布式搜索引擎;
? 3)可以擴展到上百萬臺服務器,能處理PB級結構化或非結構化的數據
2.NRT
? NRT是近實時Near Realtime的縮寫。ES是一款近實時的搜索平臺,即意味著有輕微的延遲,在從開始索引文檔到有結果的時間稍微延遲通常為1秒。
3.ES和SQL
? ES也是一種數據庫,學習ES可以對比SQL來理解和學習。下面先列出二者的關系如表-1,方便讀者有個大概了解。第二節會詳細介紹關于ES的常用術語。
二、存儲相關
1.物理存儲
1)Cluster
? 集群是一個或者一個以上的節點(服務器)的集合。并在所有節點上提供聯合的索引和搜索功能。集群由唯一的名稱標識,默認情況下是“elasticsearch”。該名稱很重要,因為如果節點設置為通過其名稱加入集群,則節點只能是集群的一部分。
2)Node
? 節點是作為集群一部分的單一服務器,存儲您的數據,并參與集群的索引和搜索功能。就像一個集群一樣,一個節點由一個名稱來標識,默認情況下是一個隨機的通用唯一標識符(UUID),它在啟動時分配給該節點。所有的節點通過設置集群名cluster.name來確定屬于某個集群。
3)Shard
? 由于索引存在存儲可能超過單個節點的硬件限制的大量數據。例如,占用1TB磁盤空間的10億個文檔的單個索引可能不適合單個節點的磁盤,或者可能太慢,無法單獨從單個節點提供搜索請求。因此分片就是為了解決這個問題。每個索引被分成若干個分片。分片被存儲在不同的節點中。分片很重要,使用分片的作用:
a) 允許水平分割/縮放內容,提高擴展能力;
b) 允許在分片(可能在多個節點上)分布和并行操作,從而提高性能/吞吐量;
4)Replica
? 副本是分片的復制。副本的作用:
a) 如果分片/節點出現故障,則可提供高可用性
b) 允許擴展搜索量/吞吐量,因為可以對所有副本并行執行搜索
? 默認情默認情況下,ElasticSearch中的每個索引都分配了5個主分片和1個副本況下,ElasticSearch中的每個索引都分配了5個主分片和1個副本。創建索引后,您可以隨時動態更改副本數,但不能更改主分片數。
2.邏輯存儲
1)Index
? 索引是具有某種相似特征的文檔的集合。例如,您可以擁有客戶數據的索引,產品目錄的另一個索引,以及訂單數據的另一個索引。索引由名稱(必須全部為小寫)標識,該名稱用于在針對其中的文檔執行索引,搜索,更新和刪除操作時引用索引。
2)Type
? 類型是您的索引的邏輯類別/分區,允許您將不同類型的文檔存儲在同一索引中,例如用戶的一種類型,博客文章的另一種類型。在索引中不再可能創建多個類型,并且在以后的版本中將刪除整個類型的概念。
3)Document
? 文檔是可以索引的基本信息單元。例如,您可以為單個客戶提供文檔,單個產品的文檔,單個訂單的另一個文檔。該文檔以JSON(JavaScript Object Notation)表示,它是一種無處不在的互聯網數據交換格式。
4)Field
? 多個字段組成一個文檔。一個索引的所有文檔類型中對于具有相同名稱的字段必須是同一種數據類型,與SQL SERVER不同,同一數據庫中不同表中相同名稱的列數據類型可以不一樣。
5)Mapping
? 映射就是字段即字段和字段類型的對應關系。映射機制用于進行字段類型確認,將每個字段匹配為一種確定的數據類型。例如:字段name,類型是String;字段age,類型是Integer。除此之外字段的類型也可以是日期、布爾值、數組、浮點數、對象等等。
三、基礎操作
1.創建
增加一行數據,使用關鍵字Create。內容按照json數據,可以手動寫,也可以根據已知的json格式創建。
語法模板一:
curl -XPOST localhost:9200/索引名/類型名/'-d'
{"title":"xxxx","text":"xxxx","date":"2014/01/01"}
備注:-d參數用于將數據放在http請求的body中發送
語法模板二:
curl -XPOST localhost:9200/create_index_action/索引名/類型名/ --data-binary @a.json
備注:依據據a.json創建
2.刪除
刪除一行數據,使用關鍵字Delete。
語法模板:
curl -XDELETE localhost:9200/索引名/類型名/ID
備注:ID號一般是自動生成的唯一標志符,也可以更具需要自定義。
3.修改
修改一行數據,使用關鍵字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指的是即將更新的當前源文檔
4.簡單查詢
查詢數據,使用關鍵字Search。
語法模板:
1)空查詢:
? curl -XGET localhost:9200/_search?pretty
? 備注:返回索引中所有的文檔
2)根據id號來查詢:
? curl -XGET localhost:9200/索引名/類型名/_search?q="_id":"AV4CnR6NuLtuw-m9JsB_"
3)模糊查詢:
? curl -XGET localhost:9200/_all/_search?q="add"
? 備注:查詢有add的文檔
5.批處理
? 批量處理數據,使用關鍵字bulk。
語法模板:
1)同時修改多個索引
? curl -XPOST localhost:9200/索引名/類型名/_bulk?pretty
? {"index":{"_id":"1"}}
? {"name": "John Doe" }
? {"index":{"_id":"2"}}
? {"name": "Jane Doe" }
2)對多個索引進行不同的處理操作
? curl -XPOST localhost:9200/索引名/類型名/_bulk?pretty
? {"update":{"_id":"1"}}
? {"doc": { "name": "John Doe becomes JaneDoe" } }
? {"delete":{"_id":"2"}}
6.搜索結果釋義
圖-1是一張搜索結果的截圖,下面將針對搜索結果的結構解釋來查看數據內容。
搜索結果備注:
took:執行ES的搜索需要的時間
timed_out:是否超時
_shards:搜索了多少個分片,成功數量,失敗數量
hits:搜索結果,通過鍵值對展示
hits.total:符合搜索條件的文件總數
hits.hits:實際搜索結果數組
_index:該條數據所在索引
_type:該條數據所在類型
_id:該數據的唯一標識符
_source:該條數據的內容,里面由多個fields組成
四、復雜查詢
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用于精確匹配某些值,如數字,日期,布爾值
? ?{"term":{"age":20}}
? ?{"term":{"date":"2017-08-21"}}
2) terms與term類似,但允許指定多個匹配條件,當某個字段存在多個值時
? ? {"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"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ?}?
}