Elasticsearch用戶指南 一 基礎(chǔ)(2)

版本5.0 官方文檔英文版

相關(guān)文章:

五冬念、瀏覽你的數(shù)據(jù)

現(xiàn)在我們已經(jīng)概覽了基礎(chǔ),讓我們看下更實用的數(shù)據(jù)集认烁。這里已經(jīng)準備好了一批虛構(gòu)的用戶銀行賬戶JSON文檔棋返,每一個文檔都是如下結(jié)構(gòu):

{
    "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"
}

同時會創(chuàng)建一個bank索引钱雷。

5.1 搜索API

現(xiàn)在讓我們一起開始一些簡單的搜索。有兩個基本的方式來執(zhí)行搜索:

  • 通過REST request URI發(fā)送參數(shù)
  • 通過REST request body發(fā)送參數(shù)

request body方法可以讓你通過靈活票从、更直觀的JSON格式來搜索漫雕。我們將會嘗試一個REST request URI方法搜索的例子但是在這份文檔的剩余部分只會使用request body method這種方式。

搜索API從_search開始峰鄙,下面的例子會返回bank索引里所有文檔:

GET /bank/_search?q=*&sort=account_number:asc&pretty

讓我們仔細分析這個搜索請求蝎亚。我們從bank索引里搜索,q=*參數(shù)指示Elasticsearch去匹配索引中所有的文檔先馆。sort=account_number:asc參數(shù)表示使用文檔中account_number字段按照ascii碼順序排列发框。pretty參數(shù)告訴Elasticsearch返回格式良好的JSON結(jié)果。下面是部分返回結(jié)果:

{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie"...}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke"...}
    }, ...
    ]
  }
}

下面是一些返回的參數(shù):

  • tookElasticsearch執(zhí)行搜索用的時間(毫秒數(shù))
  • timed_out搜索是否超時
  • _shards多少個切片被搜索煤墙,還有成功/失敗的搜索切片數(shù)
  • hits搜索結(jié)果
  • hits.total搜索結(jié)果總數(shù)
  • hits.hits實際搜索結(jié)果(默認是前10個文檔)
  • sort用來排序的值(如果通過score排序則沒有這個參數(shù))
  • _scoremax_score暫時忽略

下面的搜索條件與上面搜索完全相同梅惯,但是使用request body method:

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

重要的是一旦你接收到了搜索結(jié)果,Elasticsearch已經(jīng)完成了請求不會保留任何服務(wù)端資源或者在你的結(jié)果里開放指針仿野。

5.2 查詢語言介紹

Elasticsearch提供了一個特定于域的JSON風格的語言來執(zhí)行查詢铣减。這個查詢語言是非常全面的甚至第一眼看時有點讓人畏懼,最好的方式是從一些基本的例子開始學(xué)習脚作。

回到上一個例子葫哗,我們執(zhí)行以下查詢:

GET /bank/_search
{
  "query": { "match_all": {} }
}

query部分指定我們的查詢定義,match_all部分是我們要查詢的類型球涛,match_all表示在指定的索引中查詢?nèi)康奈臋n劣针。

除了query參數(shù),我們還可以傳遞另外一個參數(shù)來影響查詢結(jié)果亿扁,之前我們傳遞的是sort參數(shù)捺典,這里我們傳遞size

GET /bank/_search
{
  "query": { "match_all": {} },
  "size": 1
}

size表示每次查詢返回的結(jié)果數(shù)量,這里只返回1條結(jié)果从祝。注意:如果size沒有指定襟己,默認值是10。

下面的例子表示從所有結(jié)果里查詢第11-20之間的文檔:

GET /bank/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}

from參數(shù)是從0開始的牍陌,它指定了從那個文檔索引開始查詢擎浴,查詢size個文檔。這個特性可以用來實現(xiàn)分頁毒涧。如果from未指定贮预,默認是0。

5.3 執(zhí)行查詢

我們已經(jīng)看了一些基本的查詢參數(shù)了,讓我們更深入的了解下Query DSL萌狂。我們先看下搜索返回的_source域档玻,默認的被搜索到的文檔會整體被作為結(jié)果的一部分返回來。如果我們不想整個文檔被返回來茫藏,我們可以只請求文檔中的部分資源被返回误趴。

下面這個例子只返回account_numberbalance字段:

GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}

這樣返回的_source里只有account_numberbalance的數(shù)據(jù)。類似與SQL中的SELECT的作用务傲。

之前我們使用match_all來查詢所有的文檔凉当,下面我們來學(xué)習match query:

下面的例子查詢account_number包含20的文檔:

GET /bank/_search
{
  "query": { "match": { "account_number": 20 } }
}

查詢地址里有"mill"的所有文檔:

GET /bank/_search
{
  "query": { "match": { "address": "mill" } }
}

查詢地址里有"mill"或者"lane"的所有文檔:

GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}

match_phrasematch的一個變種,它會吧條件作為一個整體(短語)售葡,中間有空格不會被當做或者條件看杭,我們查詢下地址包含"mill lane"的文檔:

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

下面我們介紹下bool(ean) query,bool query允許我們通過boolean邏輯將一些小的查詢組成一個大的查詢挟伙。

下面這個例子組合兩個match查詢楼雹,查詢地址里包含"mill"和"lane"的所有文檔:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

這個例子里,bool尖阔、must條件指定了所有match查詢對于一個文檔必須都是true時才返回贮缅。

下面這個例子組合兩個match查詢,查詢地址里包含"mill"或者"lane"的所有文檔:

GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

這個例子里介却,bool谴供、must條件指定了所有match查詢對于一個文檔必須有一個是true時才返回。

下面這個例子組合兩個match查詢齿坷,查詢地址里即不包含"mill"也不包含"lane"的文檔:

GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

這個與must類似桂肌,只是條件相反。

我們可以合并must, should, 和must_not條件在一個bool查詢里永淌。

下面的例子查詢年齡是40歲崎场,并且不住在ID(一個地名縮寫):

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

5.4 執(zhí)行過濾器

之前的章節(jié)里,我們跳過了一小段叫做document score(搜索結(jié)果里的_score字段)仰禀。score是一個數(shù)字類型照雁,表示文檔相對于我們指定的搜索條件的匹配程度。分數(shù)越高答恶,這個文檔就越符合我們的搜索條件。

但是查詢不一定每次都需要產(chǎn)生score萍诱,特別是我們僅對文檔集進行篩選時悬嗓。

bool query查詢也支持filter條件,作為一個例子我們介紹下range query裕坊,它允許我們通過一段值的范圍來過濾文檔集包竹。它通常被用作數(shù)字和日期過濾。

下面的例子我們使用一個bool query返回所有賬戶余額大于等于20000并且小于等于30000之間的所有賬戶:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

現(xiàn)在介紹了match_all, match, bool, 和 range查詢,還有許多類型的查詢我們不會在這里繼續(xù)介紹了周瞎。我們有了一個基本的理解后苗缩,學(xué)習其他類型的查詢應(yīng)該不是困難的。

5.5 執(zhí)行聚合

聚合提供了分組和提取分析的能力声诸。最簡單的方法來理解就是與SQL中的GROUP BY和其他聚合函數(shù)類比酱讶。

在Elasticsearch里,你可以在一個搜索響應(yīng)里同時接收執(zhí)行搜索返回命中的結(jié)果和聚合結(jié)果彼乌。這是一個很強大的功能泻肯,在某些場景下你可以運行多個查詢和多個聚合,并且在一個響應(yīng)里同時接收兩者的結(jié)果慰照,這降低了與服務(wù)器之間的數(shù)據(jù)交互的次數(shù)灶挟。

現(xiàn)在我們將所有賬戶按照州來分組,并且返回最上面的10個州毒租,按照每個分組的數(shù)量降序排列(默認的):

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

如果用SQL語句則類似下面的語句:

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

下面是返回結(jié)果(部分):

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770,
      "buckets" : [ {
        "key" : "ID",
        "doc_count" : 27
      }, {
        "key" : "TX",
        "doc_count" : 27
      }, {
        "key" : "AL",
        "doc_count" : 25
      }, {
        "key" : "MD",
        "doc_count" : 25
      }, {
        "key" : "TN",
        "doc_count" : 23
      }, {
        "key" : "MA",
        "doc_count" : 21
      }, {
        "key" : "NC",
        "doc_count" : 21
      }, {
        "key" : "ND",
        "doc_count" : 21
      }, {
        "key" : "ME",
        "doc_count" : 20
      }, {
        "key" : "MO",
        "doc_count" : 20
      } ]
    }
  }
}

注意hits的空的稚铣,因為我們只想看到聚合結(jié)果。

在前面查詢的基礎(chǔ)上墅垮,我們來計算下每個州的賬戶平均余額:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

注意我們是怎么在group_by_state里嵌套average_balance聚合的榛泛。這是所有聚合的一種通用模式。

先在讓我在上面的查詢里再修改下噩斟,默認的是按照每個分組的數(shù)量降序排列的曹锨,現(xiàn)在我們按照每個州的余額降序排列:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

接下來的例子示范了如何按照年齡分組(20-29, 30-39, 40-49),然后按照性別分組剃允,最后計算每個年齡段沛简,男女的平均余額:

GET /bank/_search
{
  "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.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

還有很多聚合的能力請參考aggregations reference guide

到此用戶指南的入門部分結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斥废,一起剝皮案震驚了整個濱河市椒楣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牡肉,老刑警劉巖捧灰,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異统锤,居然都是意外死亡毛俏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門饲窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煌寇,“玉大人,你說我怎么就攤上這事逾雄》埽” “怎么了腻脏?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長银锻。 經(jīng)常有香客問我永品,道長,這世上最難降的妖魔是什么击纬? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任鼎姐,我火速辦了婚禮,結(jié)果婚禮上掉弛,老公的妹妹穿的比我還像新娘症见。我一直安慰自己,他們只是感情好殃饿,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布谋作。 她就那樣靜靜地躺著,像睡著了一般乎芳。 火紅的嫁衣襯著肌膚如雪遵蚜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天奈惑,我揣著相機與錄音吭净,去河邊找鬼。 笑死肴甸,一個胖子當著我的面吹牛寂殉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播原在,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼友扰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庶柿?” 一聲冷哼從身側(cè)響起村怪,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浮庐,沒想到半個月后甚负,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡审残,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年梭域,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片维苔。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡碰辅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出介时,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布沸柔,位于F島的核電站循衰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褐澎。R本人自食惡果不足惜会钝,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望工三。 院中可真熱鬧迁酸,春花似錦、人聲如沸俭正。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掸读。三九已至串远,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儿惫,已是汗流浹背澡罚。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肾请,地道東北人留搔。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像铛铁,于是被迫代替她去往敵國和親隔显。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 博客原文一博客原文二 翻譯作品避归,水平有限荣月,如有錯誤,煩請留言指正梳毙。原文請見 官網(wǎng)英文文檔 起步 Elasticse...
    rabbitGYK閱讀 3,230評論 0 68
  • 介紹查詢語言 Elasticsearch提供一種JSON風格的特定領(lǐng)域語言哺窄,利用它你可以執(zhí)行查詢。這杯稱為查詢DS...
    山天大畜閱讀 3,721評論 0 1
  • 探索你的數(shù)據(jù) 樣本數(shù)據(jù)集 現(xiàn)在我們對于基本的東西已經(jīng)有了一些感覺账锹,現(xiàn)在讓我們嘗試使用一些更加貼近現(xiàn)實的數(shù)據(jù)集萌业。我已...
    Jason__Ding閱讀 405評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)奸柬,斷路器生年,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 一、因為剛好遇見你們 算是做出了一個改變廓奕,開學(xué)前便在班群里表現(xiàn)自己的活躍抱婉。我可不是初中那個畏畏縮縮的膽小鬼...
    平行四邊形_閱讀 237評論 0 0