GET API是Elasticsearch中經常使用的操做,通常用於驗證文檔是否存在;或者執行CURD中的文檔查詢。與檢索不一樣的是,GET查詢是實時查詢,能夠實時查詢到索引結果。而檢索則是須要通過處理,通常默認是1秒鐘吧...才能搜索到。合理利用這些方法,能夠更靈活的使用Elasticsearch。
更多內容參考ELK教程html
閱讀這篇文檔,發現本身對不少地方不是很理解。好比存儲機制、版本維護等等。暫時先作爲階段性的學習吧...後續更新在回來補補....網絡
Get API容許基於ID字段從Elasticsearch查詢JSON文檔,下面就是一個查詢的例子:session
curl -XGET 'http://localhost:9200/twitter/tweet/1'
上面的命令表示,在twitter索引的tweet類型中查詢id爲1的文檔,返回結果以下:app
{ "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_version" : 1, "found": true, "_source" : { "user" : "kimchy", "postDate" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" } }
上面返回的數據包括文檔的基本內容,_index
是索引名稱,_type
是類型,_id
是ID,_version
是版本號。_source
字段包括了文檔的基本內容;found
字段表明是否找到。curl
這個API支持使用HEAD方式提交,這樣能夠驗證這個ID是否存在,而不會返回無用的數據。分佈式
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1'
默認狀況下get API是實時的,並不會受到索引的刷新頻率的影響。(也就是說,只要索引的數據,就能夠立馬查詢到)post
有的時候咱們可能想要關閉實時查詢,這樣能夠設置realtime=false。也能夠在配置文件中配置,使之全局可用,即配置action.get.realtime爲false。性能
When getting a document, one can specify fields to fetch from it. They will, when possible, be fetched as stored fields (fields mapped as stored in the mapping). When using realtime GET, there is no notion of stored fields (at least for a period of time, basically, until the next flush), so they will be extracted from the source itself (note, even if source is not enabled). It is a good practice to assume that the fields will be loaded from source when using realtime GET, even if the fields are stored.當查詢文檔的時候,能夠從文檔中獲取特定的字段。通常來講這些字段多是被存儲的。當咱們使用實時GET查詢的時候,就會忽略這些存儲的字段,直接從source裏面拿到字段數據。---- 我的不是很理解這段,因而把原文貼上來,要是理解錯誤,還請指正。學習
記得映射類型中,字段有幾個屬性,類型、是否被存儲、是否被分析,我猜測上面指的應該就是這個被存儲吧。也就是說,GET查詢的時候並不會從這些存儲的字段中查數據,而是直接從source中查詢。那麼這些存儲的字段使用來幹嗎的呢?暫且記下....說不定之後整理的文檔中會遇到!fetch
API中類型_type是可選的,若是想要查詢全部的類型,能夠直接指定類型爲_all
,從而匹配全部的類型。
默認狀況下get操做會返回_source字段,除非你使用了fields
字段或者禁用了_source
字段。經過設置_source
屬性,能夠禁止返回source內容:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source=false'
若是想要返回特定的字段,可使用_source_include
或者_source_exclude
進行過濾。可使用逗號分隔來設置多種匹配模式,好比:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source_include=*.id&_source_exclude=entities'
若是但願返回特定的字段,也能夠直接寫上字段的名稱:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source=*.id,retweeted'
get操做容許設置fields字段,返回特定的字段:
curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=title,content'
若是請求的字段沒有被存儲,那麼他們會從source中分析出來,這個功能也能夠用source_filter來替代。
元數據好比_routing
和_parent
是永遠不會被返回的。
Also only leaf fields can be returned via the field option. So object fields can’t be returned and such requests will fail.只有葉子字段才能經過field選項返回.因此對象字段這種是不能返回的,這種請求也會失敗。
若是在執行完索引操做,沒有刷新,那麼GET操做會讀取translog的內容來查詢文檔。然而有一些字段僅僅是在索引的時候產生的。若是你嘗試讀取索引中的生成的字段,就會出現錯誤。能夠設置ignore_erros_on_generated_fields=true
來忽略錯誤。
其實我的也不太理解這個生成字段是什麼意思?
不過這個Translog比較有意思,是在文檔的後面纔有介紹。就是索引的數據要進行存儲,那麼總不可能索引一條就更新一次Lucene結構吧。因此就搞了個translog,數據的變更會先放在translog裏面,再刷新到es中。實時查詢,實際上是讀取了translog中,還未持久化的數據。
使用/{index}/{type}/{id}/_source能夠僅僅返回_source字段,而沒必要返回過多沒必要要的信息,浪費網絡帶寬。
curl -XGET 'http://localhost:9200/twitter/tweet/1/_source'
也可使用過濾機制:
curl -XGET 'http://localhost:9200/twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'
也是支持使用HEAD方式,驗證是否存在:
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1/_source'
當索引的時候指定了路由,那麼查詢的時候就必定要指定路由。
curl -XGET 'http://localhost:9200/twitter/tweet/1?routing=kimchy'
若是路由信息不正確,就會查找不到文檔
控制爲get請求維護一個分片的索引,這個索引能夠設置爲:
refresh參數可讓每次get以前都刷新分片,使這個值能夠被搜索。設置true的時候,儘可能要考慮下性能問題,由於每次刷新都會給系統帶來必定的壓力
get操做會經過特定的哈希方法,把請求分配給特定的分片進行查詢。因爲在分佈式的環境下,主分片和備份分片做爲一個組,均可以支持get請求。這就意味着,分片的數量越多,get執行的規模就越大。
You can use the version parameter to retrieve the document only if it’s current version is equal to the specified one. This behavior is the same for all version types with the exception of version type FORCE which always retrieves the document.你可使用version參數檢索文檔,不過version參數的值必須等於當前版本號。當版本類型爲FORCE的時候,全部的版本類型均可以檢索文檔。
關於es的版本號,理解的真是不夠透徹....
在ES的內部,會給那些被刪除或者被整個替換的文檔打上一個標記。老版本的文檔並不會當即刪除,固然你也不能訪問到它。ES會在後臺清理,以便能有更多的空間索引數據。