Elasticsearch增刪改查 之 —— Get查詢


GET API是Elasticsearch中常用的操作,一般用於驗證文檔是否存在;或者執行CURD中的文檔查詢。與檢索不同的是,GET查詢是實時查詢,可以實時查詢到索引結果。而檢索則是需要經過處理,一般默認是1秒鍾吧...才能搜索到。合理利用這些方法,可以更靈活的使用Elasticsearch。
更多內容參考ELK教程

閱讀這篇文檔,發現自己對很多地方不是很理解。比如存儲機制、版本維護等等。暫時先做為階段性的學習吧...后續更新在回來補補....

查詢樣例

Get API允許基於ID字段從Elasticsearch查詢JSON文檔,下面就是一個查詢的例子:

curl -XGET 'http://localhost:9200/twitter/tweet/1'

上面的命令表示,在twitter索引的tweet類型中查詢id為1的文檔,返回結果如下:

{
    "_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字段代表是否找到。

這個API支持使用HEAD方式提交,這樣可以驗證這個ID是否存在,而不會返回無用的數據。

curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1'

實時

默認情況下get API是實時的,並不會受到索引的刷新頻率的影響。(也就是說,只要索引的數據,就可以立馬查詢到)

有的時候我們可能想要關閉實時查詢,這樣可以設置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中查詢。那么這些存儲的字段使用來干嘛的呢?暫且記下....說不定以后整理的文檔中會遇到!

類型可選

API中類型_type是可選的,如果想要查詢所有的類型,可以直接指定類型為_all,從而匹配所有的類型。

source過濾

默認情況下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選項返回.所以對象字段這種是不能返回的,這種請求也會失敗。

Generated fields

如果在執行完索引操作,沒有刷新,那么GET操作會讀取translog的內容來查詢文檔。然而有一些字段僅僅是在索引的時候產生的。如果你嘗試讀取索引中的生成的字段,就會出現錯誤。可以設置ignore_erros_on_generated_fields=true來忽略錯誤。

其實個人也不太理解這個生成字段是什么意思?

不過這個Translog比較有意思,是在文檔的后面才有介紹。就是索引的數據要進行存儲,那么總不可能索引一條就更新一次Lucene結構吧。所以就搞了個translog,數據的變動會先放在translog里面,再刷新到es中。實時查詢,其實是讀取了translog中,還未持久化的數據。

僅返回_source

使用/{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'

如果路由信息不正確,就會查找不到文檔

Preference

控制為get請求維護一個分片的索引,這個索引可以設置為:

  • _primary 這個操作僅僅會在主分片上執行。
  • _local 這個操作會在本地的分片上執行。
  • Custom (string) value 用戶可以自定義值,對於相同的分片可以設置相同的值。這樣可以保證不同的刷新狀態下,查詢不同的分片。就像sessionid或者用戶名一樣。

刷新

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會在后台清理,以便能有更多的空間索引數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM