對於提供全文檢索的工具來講,索引時一個關鍵的過程——只有經過索引操做,才能對數據進行分析存儲、建立倒排索引,從而讓使用者查詢到相關的信息。html
本篇就ES的數據索引操做相關的內容展開:數據庫
更多內容參考:Elasticsearch資料彙總app
最簡單的用法就是指定索引操做的index索引、type類型、ID(須要區分動詞的索引和名次的索引),參考下面的例子:框架
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'
這樣就在索引twitter中的tweet類型中存儲了id爲1的數據。curl
索引操做的結果爲:elasticsearch
{ "_shards" : { "total" : 10, "failed" : 0, "successful" : 10 }, "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_version" : 1, "created" : true }
上面的_shards中描述了分片相關的信息,即當前一共有10個分片(5個主分片,5個副分片,而且都可用);以及index、type、id、version相關的信息。工具
若是上面執行操做前,ES中沒有twitter這個索引,那麼默認會直接建立這個索引;而且type字段也會自動建立。也就是說,ES並不須要像傳統的數據庫事先定義表的結構。post
每一個索引中的類型都有一個mapping映射,這個映射是動態生成的,所以當增長新的字段時,會自動增長mapping的設置。性能
經過在配置文件中設置action.auto_create_index爲false,能夠關閉自動建立index這個功能。url
自動建立索引功能,也能夠設置黑名單或者白名單,好比:
設置action.auto_create_index爲 +aaa*,-bbb*,'+'號意味着容許建立aaa開頭的索引,'-'號意味着不容許建立bbb開頭的索引。
版本號維護了一個文檔的狀態,咱們只會針對最高版本號的文檔進行操做。
文檔號不只能夠在文檔中進行存儲,也能夠在外部維護版本號,具體的參考官方文檔吧....
ES經過參數op_type提供「缺乏即加入」的功能,即若是ES中沒有該文檔,就進行索引;若是有了,則報錯返回。
若是已經存在id爲1的文檔,則會報錯,直接使用_create API,效果同樣:
按照最上面的例子來講,ES會把咱們指定的文檔id作爲ID。若是不指定ID,那麼就會隨機分配一個:
ES是經過路由來進行查詢的,通常一個查詢會通過下面的過程:
1 節點接收請求,廣播給每一個分片
2 分片接收請求,進行計算,返回結果
3 合併消息,返回
若是咱們設置了路由信息,就至關於告訴了ES,該去哪一個分片查詢數據,也就取消了廣播合併這個過程,從而提升了查詢的效率。使用方法:
$ curl -XPOST 'http://localhost:9200/twitter/tweet?routing=kimchy' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'
路由是經過哈希來實現的,若是咱們在索引的時候直接指定routing的值,就會按照這個值計算哈希值,分配分片;若是不指定,就會根據ID來分配。因爲通常狀況下ID都是隨機生成的,這樣就能夠保證默認狀況下分片的數據負載是相同的。若是咱們須要在特定的分片保存特定的內容,就可使用路由指定分片。不過這樣作,往後隨着數據量的增長,也可能會致使某個分片壓力過大。
另外,也能夠在定義mapping的時候,直接設置routing的相關值。這樣這個類型中的數據若是不指定routing的值,默認就會使用mapping中定義的那個路由值。
ES中可能會涉及到一些文檔的從屬關係,使用parent參數,能夠設置這種關係:
$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{ "tag" : "something" }'
時間戳字段能夠也能夠在索引操做時指定:
$ curl -XPUT localhost:9200/twitter/tweet/1?timestamp=2009-11-15T14%3A12%3A12 -d '{ "user" : "kimchy", "message" : "trying out Elasticsearch" }'
若是沒有手動指定時間戳,_source中也不存在時間戳,就會設置爲索引指定的時間。不過須要指定mapping中的_timestamp設置爲enable
PUT my_index { "mappings": { "my_type": { "_timestamp": { "enabled": true } } } }
ES中也能夠設置文檔自動過時,過時是設置一個正的時間間隔,而後以_timestamp爲基準,若是超時,就會自動刪除。
若是設置爲時間戳:
curl -XPUT 'http://localhost:9200/twitter/tweet/1?ttl=86400000' -d '{ "user": "kimchy", "message": "Trying out elasticsearch, so far so good?" }'
若是設置爲日期數學表達式:
curl -XPUT 'http://localhost:9200/twitter/tweet/1?ttl=1d' -d '{ "user": "kimchy", "message": "Trying out elasticsearch, so far so good?" }'
也能夠在JSON字段中指定:
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "_ttl": "1d", "user": "kimchy", "message": "Trying out elasticsearch, so far so good?" }'
因爲ES並非一個實時索引搜索的框架,所以數據在索引操做後,須要等1秒鐘才能搜索到。這裏的搜索是指進行檢索操做。若是你使用的是get這種API,就是真正的實時操做了。他們之間的不一樣是,檢索可能還須要進行分析和計算分值相關性排序等操做。
爲了在數據索引操做後,立刻就能搜索到,也能夠手動執行refresh操做。只要在API後面添加refresh=true便可。
這種操做僅推薦在特殊狀況下使用,若是在大量因此操做中,每一個操做都執行refresh,那是很耗費性能的。
分片並非隨時可用的,當分片進行備份等操做時,是不能進行索引操做的。所以須要等待分片可用後,再進行操做。這時,就會出現必定的等待時間,若是超過等地時間則返回並拋出錯誤,這個等待時間能夠經過timeout設置:
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1?timeout=5m' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'
以上即是索引操做相關的知識,還有一些高級的知識,好比分片和版本號詳細的用法,因爲對ES仍是理解的不夠透徹,就先不作過多的講述了,省得錯誤太多。
若有異議,還請多多指正。