類似於insert。例如索引乙個文件到乙個索引
倒排索引
預設每個屬性都會有乙個倒排索引,可以設定屬性不被索引,它只能被覆蓋,不能被修改
型別類似表,同一索引的不同型別,可以擁有不同的字段,但應該擁有大部分相似的字段。它可以包含大小寫,不能包含句號,不能以下劃線開頭,長度限制為256.
id文件的id,可以在生成文件時指定或自動生成,自動生成的id,在大部分情況下多個節點的時候唯一。如果在建立文件時,id衝突,伺服器會返回409
文件類似於記錄,文件只能被替換,而不能被修改,文件的字段型別需要一致,否則無法進行精確匹配
精確值欄位
對於數字,日期,布林和乙個not_analyzed欄位,進行查詢,會適用精確匹配
全文搜尋字段
否則,進行相關性搜尋
put /megacorp/employee/1
例如megacorp是索引
employee是型別
1是文件id
json內容是文件
互動restful api
curl -x 『?/:/
?』 -d 『』
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 格式的請求體 (如果請求需要的話)
例子request:
}檢索文件功能
獲取乙個文件
get /megacorp/employee/1
簡單查詢
get /megacorp/employee/_search #查詢前十條記錄
get /megacorp/employee/_search?q=last_name:smith #查詢smith的前十條記錄
表示式查詢
get /megacorp/employee/_search}}
get /megacorp/employee/_search
},「filter」: }}
}}}全文檢索
get /megacorp/employee/_search}}
短語查詢
get /megacorp/employee/_search}}
分析(類似於聚合group by)
request:
get /megacorp/employee/_search
,「aggs」 : }}
}}}response:
…「all_interests」:
},},}]
}修改文件
put /website/blog/123
舊文件不會馬上刪掉
新文件會被索引
文件的version會加一
刪除文件
delete /megacorp/employee/123
文件的version依然會加一
集群集群擁有乙個或多個節點,當有節點加入或者退出集群時,集群會重新平均分配所有資料的分布
主節點功能
增加/刪除索引
增加/刪除節點
不涉及文件的變更和搜尋,因此單一的主節點不會成為集群的效能瓶頸
索引分片的元資料在每個es節點都有儲存,每個節點在接到請求後,都知道到哪台es node找到資料,通過**請求到es node所在的機器
乙個分片的最大文件數:(2^31-128)
乙個索引的主分片數在建立時被確定,且無法修改:因為文件的儲存是用shard = hash(routing) % number_of_primary_shards來確定文件的位置的。routing預設是id,也可以自定義
分片的副本數可以隨時修改
建立索引
put /blogs
}es-cluster
故障轉移
增加一台機器到集群
es-addonenode
刪除節點
es-delonenode
分布式寫入衝突
es-datalose
對於多個client的寫入es,有可能造成寫入衝突,導致資料的丟失
在一些場景下,資料丟失是可以接受的
但是在某些場景下,是不允許的。
悲觀控制併發
傳統資料庫的控制方式。通過對記錄加鎖,來實現併發的序列執行
樂觀併發控制
es採用樂觀控制
所謂樂觀控制,就是伺服器假設大部分情況下,是不會發生衝突的,如果發生衝突,則拒絕修改,客戶端可以需要通過重新獲取並重試進行處理。
過程如下圖
es-versionconflict
分布式文件儲存
確定文件位於那個shard
shard = hash(routing) % number_of_primary_shards
api支援帶routing引數,來自定義路由,來確保相關文件路由到同乙個分片
以id新建,寫入和刪除文件
es-writedocbyid
一致性保證
none: 主分片活躍,允許寫入
all: 在所有分片活躍,允許寫入
quorum: 半數以上節點活躍,允許寫入
如果暫時沒有足夠的分片活躍,es會等待,預設等待1分鐘,可以通過引數timeout改變這個值,如果超時,則失敗返回
新索引預設有 1 個副本分片,這意味著為滿足 規定數量 應該 需要兩個活動的分片副本。 但是,這些預設的設定會阻止我們在單一節點上做任何事情。為了避免這個問題,要求只有當 number_of_replicas 大於1的時候,規定數量才會執行。
以id檢索文件
與上圖類似
以id更新文件
與上圖類似,但在更新完文件後,會重建索引
在區域性更新文件的時候,主分片會以整份文件來同步給副本,來保證資料的完整性
通過條件獲取多個文件
es-mget
搜尋返回特殊字段
get /_search
},… 9 results removed …
],「max_score」 : 1
},「took」 : 4,
「_shards」 : ,
「timed_out」 : false
}took
執行的毫秒數
_shards
查詢分片的狀態,例如有幾個分片是失敗的,幾個是成功的
timeout
可以通過在查詢設定超時,如果查詢超過時間,則只返回已經成功獲得的資料,剩餘的資料將丟棄
_index
資料**的lucene索引,文件的每乙個字段,都擁有乙個不同的lucene索引
在查詢中可以指定lucene的索引,預設是不指定的,所以會查詢該文件的所有索引,並彙總結果。如果指定,則會限定僅在指定的lucene索引中查詢資料
分頁get /_search?size=5&from=5
此方式只適用於淺分頁,如果查詢過深,會導致嚴重的效能問題。
因為例如查詢size為5,from=10000。那麼es會從各分片中都查詢10005條記錄,如果有100個shard,那麼就會有10010005條記錄,es再對這10010005排序,並僅返回5條記錄
深分頁使用游標scroll
它在es中建立了乙個有有效期的快照,提供給scroll進行資料的深度查詢
倒排索引
對一下文件進行倒排:
the quick brown fox jumped over the lazy dog
quick brown foxes leap over lazy dogs in summer
得到:倒排面臨的挑戰
quick跟quick,使用者有可能認為它們是相同的,也有可能認為是不同的
dog和dogs非常接近,在相關性搜尋時,它們應該都被搜尋到
jump和leap是同義詞,在相關性搜尋時,它們應該都被搜尋到
亞馬遜測評 www.yisuping.com
Elasticsearch 架構原理
elasticsearch的一些架構設計,對我們做效能調優 故障處理,具有非常重要的影響。下面將從elasticsearch的準實時索引的實現 自動發現 rounting和replica的讀寫過程,shard的allocate控制 在傳統的資料庫中,乙個欄位存乙個值,但是這對於全文搜尋是不足的。想要...
Elasticsearch 架構原理
elasticsearch的一些架構設計,對我們做效能調優 故障處理,具有非常重要的影響。下面將從elasticsearch的準實時索引的實現 自動發現 rounting和replica的讀寫過程,shard的allocate控制 在傳統的資料庫中,乙個欄位存乙個值,但是這對於全文搜尋是不足的。想要...
elasticsearch原理分析
集群內部原理 1 主節點 master node 主節點負責集群層面的相關操作,管理集群變更。通過配置 node.master true 預設 使節點具有被選舉為 master 的資格。主節點是全域性唯一的,將從有資格成為master的節點中進行選舉。2 資料節點 data node 負責儲存資料 ...