Loading the Sample Dataset加載樣例數(shù)據(jù)
首先下載json數(shù)據(jù)
https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json
下載下來(lái)保存為json文件次企,然后在json文件目錄上用curl上傳酷愧。
curl -H "Content-Type: application/json" -XPOST "user:password@localhost:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"
The Search API
Searches方法有兩種方式痹仙,一種是使用REST request URL狈醉,另外一種是使用REST request body幻枉,使用REST request body可以用更容易讀懂的JSON格式定義搜索规哲。
REST request URL方式搜索:
GET /bank/_search?q=*&sort=account_number:asc&pretty
讓我們來(lái)解析下參數(shù):
_search代表是search操作询兴,然后q=*參數(shù)代表ElasticSearch將匹配這個(gè)index中的所以document乃沙,然后參數(shù)sort=account_number:asc代表使用account_number這個(gè)field去排序,使用ascending(向上的)排序方式诗舰。pretty表示返回pretty-printed的JSON警儒。
接下來(lái)解析響應(yīng)的文本。
- took -代表所使用的的時(shí)間眶根。
- time_out -告訴我們有沒(méi)有超時(shí)
- _shards -告訴我們多少個(gè)片區(qū)被搜索過(guò)蜀铲,多少個(gè)片區(qū)成功搜索過(guò)
- hits -搜索結(jié)果
- hits.total -多少個(gè)document匹配我們的搜索范圍
- hits.hits -實(shí)際搜索結(jié)果的數(shù)組。默認(rèn)是10個(gè)documents属百。
- hits.sort - 結(jié)果排序的索引號(hào)记劝。
- hits._score跟max_sorce -暫時(shí)忽略這個(gè)東東。
使用REST request body請(qǐng)求示例:
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
這里跟在URL中請(qǐng)求不一樣族扰,我們提供了一個(gè)JSON格式的請(qǐng)求查詢(xún)體給_search API厌丑。在下一節(jié)我們將討論這個(gè)Json 查詢(xún)。
一旦查詢(xún)完成渔呵,ElasticSearch將不維護(hù)任何游標(biāo)(或分頁(yè))這種蹄衷。跟SQL平臺(tái)的不一樣。
Introducing the Query Language
ElasticSearch提供了一種JSON風(fēng)格的特定域語(yǔ)言DSL厘肮,可以用來(lái)執(zhí)行查詢(xún)愧口。
回顧上面的例子,我們執(zhí)行查詢(xún):
GET /bank/_search
{
"query": { "match_all": {} }
}
這個(gè)例子只是簡(jiǎn)單的使用query:match_all
查詢(xún)匹配全部的document类茂。實(shí)際上耍属,我們還可以給query添加其他參數(shù),通過(guò)其他參數(shù)來(lái)影響搜索結(jié)果巩检,例如sort厚骗,size,from這種兢哭。
如果size沒(méi)有聲明领舰,它的默認(rèn)值是10.
from聲明從哪里開(kāi)始。
GET /bank/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
}
from默認(rèn)值是0.
GET /bank/_search
{
"query": { "match_all": {} },
"sort": { "balance": { "order": "desc" } }
}
這個(gè)例子表明匹配全部,使用balance這個(gè)field進(jìn)行排序冲秽,返回前十個(gè)hit(size默認(rèn)是10)
Executing Searches
進(jìn)一步研究Query DSL舍咖。
通常,查詢(xún)返回的是full JSON document锉桑,它通常在_source field中映射排霉。如果我們只需要特定的字段,則可以限定返回的字段民轴。
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}
這個(gè)跟SQL中的SELECT字段表差不多攻柠。
特定字段查詢(xún)
GET /bank/_search
{
"query": { "match": { "account_number": 20 } }
}
只匹配account_number為20的documents。
GET /bank/_search
{
"query": { "match": { "address": "mill" } }
}
address中包含mill的documents.
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
address中包含mill :舐恪9迮ァ!或者 lane字段的document
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
address中包含 mill lane的document微驶。
這幾個(gè)例子要好好感悟浪谴。
bool query 布爾查詢(xún)
布爾查詢(xún)?cè)试S我們使用布爾邏輯較小的查詢(xún)組成一個(gè)較大的查詢(xún)。
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
bool里面有一個(gè)程度參數(shù)祈搜,must,should,must_not
對(duì)應(yīng)計(jì)算機(jī)邏輯的與或非三種邏輯士八,這個(gè)有點(diǎn)像高中的交集容燕,并集,非子集這種婚度。
Executing Filters
這里講一個(gè)細(xì)節(jié)蘸秘,document score(就是hit里面的_score field)。這個(gè)field代表document的匹配度蝗茁,匹配度越高醋虏,_score越高。
但是查詢(xún)并不是需要產(chǎn)生分手哮翘,特別是當(dāng)查只用于“filtering”的document set時(shí)候颈嚼,ElasticSearch檢測(cè)這些情況,并自動(dòng)優(yōu)化查詢(xún)執(zhí)行饭寺,以避免產(chǎn)生無(wú)用的分?jǐn)?shù)阻课。
直接上例子,這里有一個(gè)叫range query的查詢(xún)沒(méi)有介紹過(guò)艰匙。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
上面這個(gè)例子中的bool query包含了一個(gè)match_all查詢(xún)限煞,和一個(gè)range query。我們可以 將其他的任何查詢(xún)都替換到query和filter part中员凝,上述的例子中署驻,范圍查詢(xún)是非常有意義的。因?yàn)閷儆诜秶奈臋n都是!M稀瓶蚂!平等匹配的,沒(méi)有任何一個(gè)document比另一個(gè)document更為重要抚官。
除了match_all扬跋,match,bool凌节,range之外钦听,還有許多其他的查詢(xún)方式是可以用的。當(dāng)我們對(duì)他們的工作方式有了基本的了解倍奢,學(xué)習(xí)其他的方法也不困難朴上。
Executing Aggregations(聚合)
聚合提供了從數(shù)據(jù)中分組和提供信息的能力∽渖罚考慮聚合的最簡(jiǎn)單方法時(shí)將其大致等同于SQL的GROUP BY和SQL aggregate function痪宰。
在ElasticSearch中,可以執(zhí)行搜索畔裕,然后多個(gè)搜索返回的結(jié)果聚合來(lái)衣撬。就是你可以運(yùn)行多個(gè)查詢(xún)和聚合,并一次性獲取兩個(gè)操作的結(jié)果扮饶,避免使用多個(gè)API進(jìn)行網(wǎng)絡(luò)返回具练。
一個(gè)簡(jiǎn)單的聚合實(shí)例
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
我們?cè)O(shè)置size=0是為了不顯示搜索命中,因?yàn)槲覀儾幌M吹骄酆辖Y(jié)果甜无。我們只希望看到聚合的結(jié)果扛点。當(dāng)然,size=0也可以取消岂丘。
聚合可以嵌套聚合陵究。詳情。奥帘。
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
這個(gè)玩意確實(shí)很多內(nèi)容铜邮,其中<aggregation_type>就有不下50種了,基本就看到這里寨蹋,要熟悉業(yè)務(wù)去了牲距。