版本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ù):
-
took
Elasticsearch執(zhí)行搜索用的時間(毫秒數(shù)) -
timed_out
搜索是否超時 -
_shards
多少個切片被搜索煤墙,還有成功/失敗的搜索切片數(shù) -
hits
搜索結(jié)果 -
hits.total
搜索結(jié)果總數(shù) -
hits.hits
實際搜索結(jié)果(默認是前10個文檔) -
sort
用來排序的值(如果通過score排序則沒有這個參數(shù)) -
_score
和max_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_number
和balance
字段:
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}
這樣返回的_source
里只有account_number
和balance
的數(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_phrase
是match
的一個變種,它會吧條件作為一個整體(短語)售葡,中間有空格不會被當做或者條件看杭,我們查詢下地址包含"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é)束。