日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

最完整的Elasticsearch 基礎(chǔ)教程

 cathy001 2015-11-18

        
    這個REST訪問模式普遍適用于所有的API命令,如果你能記住它,你就會為掌握Elasticsearch開一個好頭。
    


修改你的數(shù)據(jù)


    Elasticsearch提供了近乎實時的數(shù)據(jù)操作和搜索功能。默認情況下,從你索引/更新/刪除你的數(shù)據(jù)動作開始到它出現(xiàn)在你的搜索結(jié)果中,大概會有1秒鐘的延遲。這和其它類似SQL的平臺不同,數(shù)據(jù)在一個事務完成之后就會立即可用。
    
    索引/替換文檔
        
        我們先前看到,怎樣索引一個文檔?,F(xiàn)在我們再次調(diào)用那個命令:
            curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
            {
              "name": "John Doe"
            }'
            
        再次,以上的命令將會把這個文檔索引到customer索引、external類型中,其ID是1。如果我們對一個不同(或相同)的文檔應用以上的命令,Elasticsearch將會用一個新的文檔來替換(重新索引)當前ID為1的那個文檔。
        
            curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
            {
              "name": "Jane Doe"
            }'
            
        以上的命令將ID為1的文檔的name字段的值從“John Doe”改成了“Jane Doe”。如果我們使用一個不同的ID,一個新的文檔將會被索引,當前已經(jīng)在索引中的文檔不會受到影響。
        
            curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '
            {
              "name": "Jane Doe"
            }'
            
        以上的命令,將會索引一個ID為2的新文檔。
        
        在索引的時候,ID部分是可選的。如果不指定,Elasticsearch將產(chǎn)生一個隨機的ID來索引這個文檔。Elasticsearch生成的ID會作為索引API調(diào)用的一部分被返回。
        
        以下的例子展示了怎樣在沒有指定ID的情況下來索引一個文檔:
        
            curl -XPOST 'localhost:9200/customer/external?pretty' -d '
            {
              "name": "Jane Doe"
            }'
            
        注意,在上面的情形中,由于我們沒有指定一個ID,我們使用的是POST而不是PUT。




更新文檔
    
    除了可以索引、替換文檔之外,我們也可以更新一個文檔。但要注意,Elasticsearch底層并不支持原地更新。在我們想要做一次更新的時候,Elasticsearch先刪除舊文檔,然后在索引一個更新過的新文檔。
    
    下面的例子展示了怎樣將我們ID為1的文檔的name字段改成“Jane Doe”:
    
        curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
        {
          "doc": { "name": "Jane Doe" }
        }'
        
    下面的例子展示了怎樣將我們ID為1的文檔的name字段改成“Jane Doe”的同時,給它加上age字段:
    
        curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
        {
          "doc": { "name": "Jane Doe", "age": 20 }
        }'
        
    更新也可以通過使用簡單的腳本來進行。這個例子使用一個腳本將age加5:
    
        curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
        {
          "script" : "ctx._source.age += 5"
        }'
        
    在上面的例子中,ctx._source指向當前要被更新的文檔。
    
    注意,在寫作本文時,更新操作只能一次應用在一個文檔上。將來,Elasticsearch將提供同時更新符合指定查詢條件的多個文檔的功能(類似于SQL的UPDATE-WHERE語句)。
    


刪除文檔
    
    刪除文檔是相當直觀的。以下的例子展示了我們怎樣刪除ID為2的文檔:
    
        curl -XDELETE 'localhost:9200/customer/external/2?pretty'
    
    我們也能夠一次刪除符合某個查詢條件的多個文檔。以下的例子展示了如何刪除名字中包含“John”的所有的客戶:
    
        curl -XDELETE 'localhost:9200/customer/external/_query?pretty' -d '
        {
          "query": { "match": { "name": "John" } }
        }'
        
    注意,以上的URI變成了/_query,以此來表明這是一個“查詢刪除”API,其中刪除查詢標準放在請求體中,但是我們?nèi)匀皇褂肈ELETE?,F(xiàn)在先不要擔心查詢語法,我們將會在本教程后面的部分中涉及。
    


批處理:
    
    除了能夠?qū)蝹€的文檔進行索引、更新和刪除之外,Elasticsearch也提供了以上操作的批量處理功能,這是通過使用_bulk API實現(xiàn)的。這個功能之所以重要,在于它提供了非常高效的機制來盡可能快的完成多個操作,與此同時使用盡可能少的網(wǎng)絡(luò)往返。
    
    作為一個快速的例子,以下調(diào)用在一次bulk操作中索引了兩個文檔(ID 1 - John Doe and ID 2 - Jane Doe):
        
        curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
        {"index":{"_id":"1"}}
        {"name": "John Doe" }
        {"index":{"_id":"2"}}
        {"name": "Jane Doe" }
        '
        
    以下例子在一個bulk操作中,首先更新第一個文檔(ID為1),然后刪除第二個文檔(ID為2):
    
        curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
        {"update":{"_id":"1"}}
        {"doc": { "name": "John Doe becomes Jane Doe" } }
        {"delete":{"_id":"2"}}
        '
        
    注意上面的delete動作,由于刪除動作只需要被刪除文檔的ID,所以并沒有對應的源文檔。
    
    bulk API按順序執(zhí)行這些動作。如果其中一個動作因為某些原因失敗了,將會繼續(xù)處理它后面的動作。當bulk API返回時,它將提供每個動作的狀態(tài)(按照同樣的順序),所以你能夠看到某個動作成功與否。




探索你的數(shù)據(jù)


    樣本數(shù)據(jù)集
        現(xiàn)在我們對于基本的東西已經(jīng)有了一些感覺,現(xiàn)在讓我們嘗試使用一些更加貼近現(xiàn)實的數(shù)據(jù)集。我已經(jīng)準備了一些假想的客戶的銀行賬戶信息的JSON文檔的樣本。文檔具有以下的模式(schema):
        
            {
                "account_number": 0,
                "balance": 16623,
                "firstname": "Bradshaw",
                "lastname": "Mckenzie",
                "age": 29,
                "gender": "F",
                "address": "244 Columbus Place",
                "employer": "Euron",
                "email": "bradshawmckenzie@euron.com",
                "city": "Hobucken",
                "state": "CO"
            }
            
        我是在http://www./上生成這些數(shù)據(jù)的。
        
    載入樣本數(shù)據(jù)
    
        你可以從https://github.com/bly2k/files/blob/master/accounts.zip?raw=true下載這個樣本數(shù)據(jù)集。將其解壓到當前目錄下,如下,將其加載到我們的集群里:
        
            curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
            curl 'localhost:9200/_cat/indices?v'
        
        響應是:
            curl 'localhost:9200/_cat/indices?v'
            health index pri rep docs.count docs.deleted store.size pri.store.size
            yellow bank    5   1       1000            0    424.4kb        424.4kb
            
        這意味著我們成功批量索引了1000個文檔到銀行索引中(account類型)。
        
    
    搜索API
    
        現(xiàn)在,讓我們以一些簡單的搜索來開始。有兩種基本的方式來運行搜索:一種是在REST請求的URI中發(fā)送搜索參數(shù),另一種是將搜索參數(shù)發(fā)送到REST請求 體中。請求體方法的表達能力更好,并且你可以使用更加可讀的JSON格式來定義搜索。我們將嘗試使用一次請求URI作為例子,但是教程的后面部分,我們將 僅僅使用請求體方法。
        
        搜索的REST API可以通過_search端點來訪問。下面這個例子返回bank索引中的所有的文檔:
        
            curl 'localhost:9200/bank/_search?q=*&pretty'
            
        我們仔細研究一下這個查詢調(diào)用。我們在bank索引中搜索(_search端點),并且q=*參數(shù)指示Elasticsearch去匹配這個索引中所有的文檔。pretty參數(shù),和以前一樣,僅僅是告訴Elasticsearch返回美觀的JSON結(jié)果。
        
        以下是響應(部分列出):
            
            curl 'localhost:9200/bank/_search?q=*&pretty'
            {
              "took" : 63,
              "timed_out" : false,
              "_shards" : {
                "total" : 5,
                "successful" : 5,
                "failed" : 0
              },
              "hits" : {
                "total" : 1000,
                "max_score" : 1.0,
                "hits" : [ {
                  "_index" : "bank",
                  "_type" : "account",
                  "_id" : "1",
                  "_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
                }, {
                  "_index" : "bank",
                  "_type" : "account",
                  "_id" : "6",
                  "_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
                }, {
                  "_index" : "bank",
                  "_type" : "account",
                  
        對于這個響應,我們看到了以下的部分:
          - took —— Elasticsearch執(zhí)行這個搜索的耗時,以毫秒為單位
          - timed_out —— 指明這個搜索是否超時
          - _shards —— 指出多少個分片被搜索了,同時也指出了成功/失敗的被搜索的shards的數(shù)量
          - hits —— 搜索結(jié)果
          - hits.total —— 能夠匹配我們查詢標準的文檔的總數(shù)目
          - hits.hits —— 真正的搜索結(jié)果數(shù)據(jù)(默認只顯示前10個文檔)
          - _score和max_score —— 現(xiàn)在先忽略這些字段
            
        使用請求體方法的等價搜索是:
        
            curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
            {
              "query": { "match_all": {} }
            }'
            
        這里的不同之處在于,并不是向URI中傳遞q=*,取而代之的是,我們在_search API的請求體中POST了一個JSON格式請求體。我們將在下一部分中討論這個JSON查詢。
        
        響應是:
            
            curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
            {
              "query": { "match_all": {} }
            }'
            {
              "took" : 26,
              "timed_out" : false,
              "_shards" : {
                "total" : 5,
                "successful" : 5,
                "failed" : 0
              },
              "hits" : {
                "total" : 1000,
                "max_score" : 1.0,
                "hits" : [ {
                  "_index" : "bank",
                  "_type" : "account",
                  "_id" : "1",
                  "_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
                }, {
                  "_index" : "bank",
                  "_type" : "account",
                  "_id" : "6",
                  "_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
                }, {
                  "_index" : "bank",
                  "_type" : "account",
                  "_id" : "13",
        
        有一點需要重點理解一下,一旦你取回了你的搜索結(jié)果,Elasticsearch就完成了使命,它不會維護任何服務器端的資源或者在你的結(jié)果中打開游標。 這是和其它類似SQL的平臺的一個鮮明的對比, 在那些平臺上,你可以在前面先獲取你查詢結(jié)果的一部分,然后如果你想獲取結(jié)果的剩余部分,你必須繼續(xù)返回服務端去取,這個過程使用一種有狀態(tài)的服務器端游 標技術(shù)。
        
介紹查詢語言


    Elasticsearch提供一種JSON風格的特定領(lǐng)域語言,利用它你可以執(zhí)行查詢。這杯稱為查詢DSL。這個查詢語言相當全面,第一眼看上去可能有些咄咄逼人,但是最好的學習方法就是以幾個基礎(chǔ)的例子來開始。
    
    回到我們上一個例子,我們執(zhí)行了這個查詢:
    
        {
          "query": { "match_all": {} }
        }
        
    分解以上的這個查詢,其中的query部分告訴我查詢的定義,match_all部分就是我們想要運行的查詢的類型。match_all查詢,就是簡單地查詢一個指定索引下的所有的文檔。
    
    除了這個query參數(shù)之外,我們也可以通過傳遞其它的參數(shù)來影響搜索結(jié)果。比如,下面做了一次match_all并只返回第一個文檔:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match_all": {} },
          "size": 1
        }'
    
    注意,如果沒有指定size的值,那么它默認就是10。
    
    下面的例子,做了一次match_all并且返回第11到第20個文檔:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match_all": {} },
          "from": 10,
          "size": 10
        }'
        
    其中的from參數(shù)(0-based)從哪個文檔開始,size參數(shù)指明從from參數(shù)開始,要返回多少個文檔。這個特性對于搜索結(jié)果分頁來說非常有幫助。注意,如果不指定from的值,它默認就是0。
    
    下面這個例子做了一次match_all并且以賬戶余額降序排序,最后返前十個文檔:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match_all": {} },
          "sort": { "balance": { "order": "desc" } }
        }'
        
        
執(zhí)行搜索


    現(xiàn)在我們已經(jīng)知道了幾個基本的參數(shù),讓我們進一步發(fā)掘查詢語言吧。首先我們看一下返回文檔的字段。默認情況下,是返回完整的JSON文檔的。這可以通過 source來引用(搜索hits中的_sourcei字段)。如果我們不想返回完整的源文檔,我們可以指定返回的幾個字段。
    
    下面這個例子說明了怎樣返回兩個字段account_number和balance(當然,這兩個字段都是指_source中的字段),以下是具體的搜索:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match_all": {} },
          "_source": ["account_number", "balance"]
        }'
        
    注意到上面的例子僅僅是簡化了_source字段。它仍將會返回一個叫做_source的字段,但是僅僅包含account_number和balance來年改革字段。
    
    如果你有SQL背景,上述查詢在概念上有些像SQL的SELECT FROM。
    
    現(xiàn)在讓我們進入到查詢部分。之前,我們看到了match_all查詢是怎樣匹配到所有的文檔的?,F(xiàn)在我們介紹一種新的查詢,叫做match查詢,這可以看成是一個簡單的字段搜索查詢(比如對應于某個或某些特定字段的搜索)。
    
    下面這個例子返回賬戶編號為20的文檔:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match": { "account_number": 20 } }
        }'
        
    下面這個例子返回地址中包含“mill”的所有賬戶:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match": { "address": "mill" } }
        }'
        
    下面這個例子返回地址中包含“mill”或者包含“l(fā)ane”的賬戶:
    
       curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match": { "address": "mill lane" } }
        }' 
        
    下面這個例子是match的變體(match_phrase),它會去匹配短語“mill lane”:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": { "match_phrase": { "address": "mill lane" } }
        }'
        
    現(xiàn)在,讓我們介紹一下布爾查詢。布爾查詢允許我們利用布爾邏輯將較小的查詢組合成較大的查詢。
    
    現(xiàn)在這個例子組合了兩個match查詢,這個組合查詢返回包含“mill”和“l(fā)ane”的所有的賬戶:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": {
            "bool": {
              "must": [
                { "match": { "address": "mill" } },
                { "match": { "address": "lane" } }
              ]
            }
          }
        }'
        
    在上面的例子中,bool must語句指明了,對于一個文檔,所有的查詢都必須為真,這個文檔才能夠匹配成功。
    
    相反的,下面的例子組合了兩個match查詢,它返回的是地址中包含“mill”或者“l(fā)ane”的所有的賬戶:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": {
            "bool": {
              "should": [
                { "match": { "address": "mill" } },
                { "match": { "address": "lane" } }
              ]
            }
          }
        }'
        
    在上面的例子中,bool should語句指明,對于一個文檔,查詢列表中,只要有一個查詢匹配,那么這個文檔就被看成是匹配的。
    
    現(xiàn)在這個例子組合了兩個查詢,它返回地址中既不包含“mill”,同時也不包含“l(fā)ane”的所有的賬戶信息:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": {
            "bool": {
              "must_not": [
                { "match": { "address": "mill" } },
                { "match": { "address": "lane" } }
              ]
            }
          }
        }'
        
    在上面的例子中, bool must_not語句指明,對于一個文檔,查詢列表中的的所有查詢都必須都不為真,這個文檔才被認為是匹配的。
    
    我們可以在一個bool查詢里一起使用must、should、must_not。此外,我們可以將bool查詢放到這樣的bool語句中來模擬復雜的、多等級的布爾邏輯。
    
    下面這個例子返回40歲以上并且不生活在ID(daho)的人的賬戶:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": {
            "bool": {
              "must": [
                { "match": { "age": "40" } }
              ],
              "must_not": [
                { "match": { "state": "ID" } }
              ]
            }
          }
        }'
        
    
執(zhí)行過濾器
    
    在先前的章節(jié)中,我們跳過了文檔得分的細節(jié)(搜索結(jié)果中的_score字段)。這個得分是與我們指定的搜索查詢匹配程度的一個相對度量。得分越高,文檔越相關(guān),得分越低文檔的相關(guān)度越低。
    
    Elasticsearch中的所有的查詢都會觸發(fā)相關(guān)度得分的計算。對于那些我們不需要相關(guān)度得分的場景下,Elasticsearch以過濾器的形式 提供了另一種查詢功能。過濾器在概念上類似于查詢,但是它們有非??斓膱?zhí)行速度,這種快的執(zhí)行速度主要有以下兩個原因
    
        - 過濾器不會計算相關(guān)度的得分,所以它們在計算上更快一些
        - 過濾器可以被緩存到內(nèi)存中,這使得在重復的搜索查詢上,其要比相應的查詢快出許多。
        
    為了理解過濾器,我們先來介紹“被過濾”的查詢,這使得你可以將一個查詢(像是match_all,match,bool等)和一個過濾器結(jié)合起來。作為一個例子,我們介紹一下范圍過濾器,它允許我們通過一個區(qū)間的值來過濾文檔。這通常被用在數(shù)字和日期的過濾上。
    
    這個例子使用一個被過濾的查詢,其返回值是越在20000到30000之間(閉區(qū)間)的賬戶。換句話說,我們想要找到越大于等于20000并且小于等于30000的賬戶。
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "query": {
            "filtered": {
              "query": { "match_all": {} },
              "filter": {
                "range": {
                  "balance": {
                    "gte": 20000,
                    "lte": 30000
                  }
                }
              }
            }
          }
        }'
        
    分解上面的例子,被過濾的查詢包含一個match_all查詢(查詢部分)和一個過濾器(filter部分)。我們可以在查詢部分中放入其他查詢,在 filter部分放入其它過濾器。在上面的應用場景中,由于所有的在這個范圍之內(nèi)的文檔都是平等的(或者說相關(guān)度都是一樣的),沒有一個文檔比另一個文檔 更相關(guān),所以這個時候使用范圍過濾器就非常合適了。
    
    通常情況下,要決定是使用過濾器還是使用查詢,你就需要問自己是否需要相關(guān)度得分。如果相關(guān)度是不重要的,使用過濾器,否則使用查詢。如果你有SQL背 景,查詢和過濾器在概念上類似于SELECT WHERE語句, although more so for filters than queries。
    
    除了match_all, match, bool,filtered和range查詢,還有很多其它類型的查uxn/過濾器,我們這里不會涉及。由于我們已經(jīng)對它們的工作原理有了基本的理解,將其應用到其它類型的查詢、過濾器上也不是件難事。
    
執(zhí)行聚合


    聚合提供了分組并統(tǒng)計數(shù)據(jù)的能力。理解聚合的最簡單的方式是將其粗略地等同為SQL的GROUP BY和SQL聚合函數(shù)。在Elasticsearch中,你可以在一個響應中同時返回命中的數(shù)據(jù)和聚合結(jié)果。你可以使用簡單的API同時運行查詢和多個聚 合,并以一次返回,這避免了來回的網(wǎng)絡(luò)通信,這是非常強大和高效的。
    
    作為開始的一個例子,我們按照state分組,按照州名的計數(shù)倒序排序:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "size": 0,
          "aggs": {
            "group_by_state": {
              "terms": {
                "field": "state"
              }
            }
          }
        }'


    在SQL中,上面的聚合在概念上類似于:
       SELECT COUNT(*) from bank GROUP BY state ORDER BY COUNT(*) DESC
   
   響應(其中一部分)是:
   
        "hits" : {
            "total" : 1000,
            "max_score" : 0.0,
            "hits" : [ ]
          },
          "aggregations" : {
            "group_by_state" : {
              "buckets" : [ {
                "key" : "al",
                "doc_count" : 21
              }, {
                "key" : "tx",
                "doc_count" : 17
              }, {
                "key" : "id",
                "doc_count" : 15
              }, {
                "key" : "ma",
                "doc_count" : 15
              }, {
                "key" : "md",
                "doc_count" : 15
              }, {
                "key" : "pa",
                "doc_count" : 15
              }, {
                "key" : "dc",
                "doc_count" : 14
              }, {
                "key" : "me",
                "doc_count" : 14
              }, {
                "key" : "mo",
                "doc_count" : 14
              }, {
                "key" : "nd",
                "doc_count" : 14
              } ]
            }
          }
        }
        
    我們可以看到AL(abama)有21個賬戶,TX有17個賬戶,ID(daho)有15個賬戶,依此類推。
    
    注意我們將size設(shè)置成0,這樣我們就可以只看到聚合結(jié)果了,而不會顯示命中的結(jié)果。
    
    在先前聚合的基礎(chǔ)上,現(xiàn)在這個例子計算了每個州的賬戶的平均余額(還是按照賬戶數(shù)量倒序排序的前10個州):
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "size": 0,
          "aggs": {
            "group_by_state": {
              "terms": {
                "field": "state"
              },
              "aggs": {
                "average_balance": {
                  "avg": {
                    "field": "balance"
                  }
                }
              }
            }
          }
        }'
        
    注意,我們把average_balance聚合嵌套在了group_by_state聚合之中。這是所有聚合的一個常用模式。你可以任意的聚合之中嵌套聚合,這樣你就可以從你的數(shù)據(jù)中抽取出想要的概述。
    
    基于前面的聚合,現(xiàn)在讓我們按照平均余額進行排序:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "size": 0,
          "aggs": {
            "group_by_state": {
              "terms": {
                "field": "state",
                "order": {
                  "average_balance": "desc"
                }
              },
              "aggs": {
                "average_balance": {
                  "avg": {
                    "field": "balance"
                  }
                }
              }
            }
          }
        }'
        
    下面的例子顯示了如何使用年齡段(20-29,30-39,40-49)分組,然后在用性別分組,然后為每一個年齡段的每一個性別計算平均賬戶余額:
    
        curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
        {
          "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": {
                    "average_balance": {
                      "avg": {
                        "field": "balance"
                      }
                    }
                  }
                }
              }
            }
          }
        }'
        
    有很多關(guān)于聚合的細節(jié),我們沒有涉及。如果你想做更進一步的實驗,http://www./guide/en /elasticsearch/reference/current/search-aggregations.html是一個非常好的起點。
    
    
總結(jié)


    Elasticsearch既是一個簡單的產(chǎn)品,也是一個復雜的產(chǎn)品。我們現(xiàn)在已經(jīng)學習到了基礎(chǔ)部分,它的一些原理,以及怎樣用REST API來做一些工作。我希望這個教程已經(jīng)使你對Elasticsearch是什么有了一個更好的理解,跟重要的是,能夠激發(fā)你繼續(xù)實驗 Elasticsearch的其它特性。



轉(zhuǎn)載: http://blog.csdn.net/cnweike/article/details/33736429 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多