curl -XPOST localhost:9200/bank/account/_bulk?PRetty --data-binary "@E:/programme/_backups/accounts.json"@后面為文件路徑,也可是相對路徑如果你的windows下沒有curl命令,可以看看這里: http://blog.csdn.net/taoshujian/article/details/60147463Elasticsearch查詢有兩種基本方式:URI和request body下面先看一個查詢示例:通過URI方式查詢執行如下命令:
#REST request URIGET /bank/_search?q=*&sort=account_number:asc&pretty返回結果如下:這里q=*參數表示匹配所有文檔。sort=account_number:asc參數表示按account_number對結果進行升序排序。pretty參數表示格式化JSON結果。至于響應,我們看到以下部分:took - Elasticsearch執行搜索的時間(以毫秒為單位)timed_out - 告訴我們搜索是否超時_shards - 告訴我們搜索了多少分片,以及成功/失敗的搜索分片的計數hits - 搜索結果hits.total - 符合我們的搜索條件的文檔總數hits.hits - 搜索結果的實際數組(默認為前10個文檔)hits.sort - 結果排序鍵(如果按分數排序,則缺少)同樣的查詢規則通過request body方式查詢時語法如下:
#REST request bodyGET /bank/_search{ "query": { "match_all": {} }, "sort": [ { "account_number": "asc" } ]}Elasticsearch提供了一種JSON風格的語言,可用于執行查詢。這被稱為Query DSL。查詢語言相當全面,實際學習它還是要從幾個基本的例子開始。#查詢所有 GET /bank/_search{ "query": { "match_all": {} }}#查詢一條 注: 默認情況下查詢的就是所有數據,所以示例中"query": { "match_all": {} }不是必寫的GET /bank/_search{ "query": { "match_all": {} }, "size": 1}#查詢第11至第20條數據 注:from默認從0開始的GET /bank/_search{ "query": { "match_all": {} }, "from": 10, "size": 10}#按balance降序GET /bank/_search{ "query": { "match_all": {} }, "sort": { "balance": { "order": "desc" } }}#只查詢account_number和balanceGET /bank/_search{ "query": { "match_all": {} }, "_source": ["account_number", "balance"]}可以將match查詢視為基本的字段化搜索查詢(即針對特定字段或字段集進行的搜索)。#查詢account_number=20的帳戶GET /bank/_search{ "query": { "match": { "account_number": 20 } }}#查詢在address中包含術語“mill”的所有帳戶GET /bank/_search{ "query": { "match": { "address": "mill" } }}#查詢在address中包含“mill”或“lane”一詞的所有帳戶:GET /bank/_search{ "query": { "match": { "address": "mill lane" } }}#此示例是match(match_phrase)的變體,查詢在address中包含短語“mill lane”的所有帳戶:GET /bank/_search{ "query": { "match_phrase": { "address": "mill lane" } }}bool查詢允許我們撰寫較小的查詢到使用布爾邏輯更大的查詢#此示例編寫兩個match查詢,即查詢address中包含“mill”和“lane”的所有帳戶。bool must子句表示所有條件必須滿足 類似于判斷條件中的&&。GET /bank/_search{ "query": { "bool": { "must": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } }}#相比之下,此示例中兩個match則是查詢并address中包含“mill”或“lane”的所有帳戶。bool should類似于判斷條件中的||GET /bank/_search{ "query": { "bool": { "should": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } }}#此示例的兩個match查詢,則是查詢address中既不包含“mill”也不包含“lane”的所有帳戶。GET /bank/_search{ "query": { "bool": { "must_not": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } }}#我們可以在查詢中同時合并must,should和must_not子句bool。此外,我們可以bool在任何這些bool子句中組合查詢來模擬任何復雜的多級布爾邏輯。此示例返回任何age=40但state!=ID的所有帳戶:GET /bank/_search{ "query": { "bool": { "must": [ { "match": { "age": "40" } } ], "must_not": [ { "match": { "state": "ID" } } ] } }}關于過濾器filters的查詢#range查詢,它允許我們通過一定范圍的值來過濾文檔。這通常用于數字或日期過濾。#使用bool查詢返回余額介于20000和30000(含)之間的所有帳戶。換句話說,我們想要找出余額大于或等于20000且小于或等于30000的帳戶。GET /bank/_search{ "query": { "bool": { "must": { "match_all": {} }, "filter": { "range": { "balance": { "gte": 20000, "lte": 30000 } } } } }}#解析上面的查詢,bool查詢包含一個match_all查詢(查詢部分)和一個range查詢(過濾器部分)。我們可以將任何其他查詢替換為查詢和過濾器部分。關于分組聚合查詢#這個例子按狀態分組所有的帳戶,然后返回前10(默認)狀態,按照count遞減排序(也是默認)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#注:設置size=0為不顯示搜索匹配。你可以不寫size=0看看返回結果#下面示例計算按州(state)的平均帳戶余額(僅針對按降序排序的前10個州)GET /bank/_search{ "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } }}#注意我們如何在average_balance聚合中嵌套group_by_state聚合。這是所有聚合的常見模式。您可以任意嵌套聚合中的聚合,以提取您需要從數據中獲得的透視摘要。基于之前的聚合,現在我們以降序對平均余額進行排序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" } } } } } } }}到這里我們會發現ElasticSearch的語法和SQL其實是異曲同工的。它因為功能強大而簡單,亦因為功能強大而復雜。事實上我這幾篇關于Elasticsearch的筆記都是根據它的官網來的,自己并沒增加什么東西,因為官方文檔很清晰了,而且我也沒有刪減什么內容,因為這些都是必要的。看過這些后,基本的增刪改查已經沒什么問題,算是上手了,那么后續將會看看它的理論基礎部份。
新聞熱點
疑難解答