009-elasticsearch【三】示例數據導入、URI查詢方式簡介、Query DSL簡介、查詢簡述【_source、match、must、should等】、過濾器、聚合
一、簡單數據
客戶銀行賬戶信息,json
{ "account_number": 0, "balance": 16623, "firstname": "Bradshaw", "lastname": "Mckenzie", "age": 29, "gender": "F", "address": "244 Columbus Place", "employer": "Euron", "email": "[email protected]", "city": "Hobucken", "state": "CO" }
批量導入1000條
測試數據地址
curl -H "Content-Type: application/json" -XPOST ‘localhost:9200/bank/account/_bulk?pretty&refresh‘ --data-binary "@accounts.json" curl ‘localhost:9200/_cat/indices?v‘
如果windows上需要把單引號改為雙引號
二、URI查詢方式簡介
有兩種運行搜索的基本方法:一種是通過REST請求URI發送搜索參數,另一種是通過REST請求主體發送搜索參數。
2.1、請求URL方式
GET /bank/_search?q=*&sort=account_number:asc&pretty
說明:q=* 參數指示Elasticsearch匹配索引中的所有文檔。
sort = account_number:asc參數指示按升序使用每個文檔的account_number字段對結果進行排序。
pretty標識返回漂亮的json格式
{ took: 31, timed_out: false, _shards: { total: 5, successful: 5, failed:0 }, hits: { total: 1000, max_score: null, hits: [ { _index: "bank", _type: "account", _id: "0", _score: null, _source: { account_number: 0, balance: 16623, firstname: "Bradshaw", lastname: "Mckenzie", age: 29, gender: "F", address: "244 Columbus Place", employer: "Euron", email: "[email protected]", city: "Hobucken", state: "CO" }, sort: [0]
} //…… ] } }
響應值說明
took:Elasticsearch執行搜索的時間(以毫秒為單位)
time_out:搜索是否超時
_shards:搜索了多少片,以及搜索片成功/失敗的次數
hits:搜索結果
hits.total:符合我們搜索條件的文件總數
hits.hits:實際的搜索結果數組(默認為前10個文檔)
hits.sort:對結果進行排序鍵(按分數排序時丟失)
hits._score and max_score:暫時忽略
2.2、請求體方式
使用工具header時候 使用post請求
GET /bank/_search { "query": { "match_all": {} }, "sort": [ { "account_number": "asc" } ] }
三、Query DSL簡介
Elasticsearch提供了一種可用於執行查詢的JSON式特定於領域的語言。這被稱為Query DSL。
註意使用header 工具時應該使用post請求
3.1、查詢所有
GET /bank/_search { "query": { "match_all": {} } }
match_all部分僅僅是我們想要運行的查詢類型。 match_all查詢只是搜索指定索引中的所有文檔。
3.2、查詢數據
GET /bank/_search { "query": { "match_all": {} }, "size": 1 }
請註意,如果未指定大小,則默認為10。
3.3、返回分頁
此示例執行match_all並返回文檔11至20:
GET /bank/_search { "query": { "match_all": {} }, "from": 10, "size": 10 }
from參數(從0開始)指定從哪個文檔索引開始,size參數指定從from參數開始返回多少個文檔。此功能在實現分頁搜索結果時非常有用。請註意,如果from未指定,則默認為0。
3.4、降序
此示例執行match_all並按帳戶余額按降序對結果進行排序,並返回前10個(默認大小)文檔。
GET /bank/_search { "query": { "match_all": {} }, "sort": { "balance": { "order": "desc" } } }
四、查詢簡述
4.1、返回指定字段
請求是增加_source字段,在概念上與SQL SELECT 字段1 FROM字段列表有些相似。
返回的文檔字段。默認情況下,完整的JSON文檔作為所有搜索的一部分返回。這被稱為源(搜索匹配中的_source字段)。如果我們不希望整個源文檔被返回,我們有能力只需要返回源內的幾個字段。
GET /bank/_search { "query": { "match_all": {} }, "_source": ["account_number", "balance"] }
4.2、匹配查詢
全匹配
"query": { "match_all": {} },
匹配查詢,它可以被認為是基本的搜索查詢(即針對特定字段或字段集合進行的搜索)。
//匹配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" } } }
//匹配 address =“mill lane” 全部的 GET /bank/_search { "query": { "match_phrase": { "address": "mill lane" } } }
4,3、bool(布爾)查詢
4.3.1、must == and
//匹配address=mill 並且 address =lane的文檔 等價於 "query": { "match_phrase": { "address": "mill lane" } }
GET /bank/_search { "query": { "bool": { "must": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } } }
bool must子句指定了一個文檔被認為是匹配的所有查詢。
4.3.2、should==or
//匹配address=mill或者address=lane 等價於 "query": { "match": { "address": "mill lane" } } GET /bank/_search { "query": { "bool": { "should": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } } }
bool should子句指定了一個查詢列表,其中任何一個查詢都必須是真的才能被認為是匹配的文檔。
4.3.3、must_not==not
//地址address!=mill 也 address!=lane GET /bank/_search { "query": { "bool": { "must_not": [ { "match": { "address": "mill" } }, { "match": { "address": "lane" } } ] } } }
bool must_not子句指定了一個查詢列表,其中任何一個查詢都不應該被認為是匹配的文檔。
4.3.4、組合使用
可以在一個bool查詢中同時結合must,should和must_not子句。此外,我們可以在任何這些bool子句中編寫布爾查詢來模擬任何復雜的多級布爾邏輯。
//返回任何40歲但未居住在ID街道人的所有帳戶 GET /bank/_search { "query": { "bool": { "must": [ { "match": { "age": "40" } } ], "must_not": [ { "match": { "state": "ID" } } ] } } }
五、過濾器簡述
文檔分數(搜索結果中的_score字段)的細節。分數是一個數值,它是文檔與我們指定的搜索查詢匹配度的相對度量。分數越高,文檔越相關,分數越低,文檔的相關性越低。
但查詢並不總是需要生成分數,特別是當它們僅用於“過濾”文檔集時。 Elasticsearch檢測這些情況並自動優化查詢執行,以便不計算無用分數。
bool查詢還支持篩選子句,它允許使用查詢來限制將由其他子句匹配的文檔,而不會更改計算分數的方式。範圍查詢,它允許我們通過一系列值來過濾文檔。這通常用於數字或日期過濾。
5.1、rang 過濾
//查找余額大於或等於20000且小於等於30000的帳戶。 GET /bank/_search { "query": { "bool": { "must": { "match_all": {} }, "filter": { "range": { "balance": { "gte": 20000, "lte": 30000 } } } } } }
解析,bool查詢包含一個match_all查詢(查詢部分)和一個範圍查詢(過濾器部分)。我們可以將任何其他查詢替換為查詢和過濾器部分。範圍查詢非常有意義,因為落入該範圍的文檔全部匹配“平等”,即沒有文檔比另一個更重要。
六、聚合
聚合提供了從數據中分組和提取統計數據的功能。考慮聚合的最簡單方法是將其大致等同於SQL GROUP BY和SQL聚合函數。在Elasticsearch中,您可以執行返回匹配的搜索,同時還可以在一個響應中返回與匹配不同的聚合結果。這是非常強大和高效的,因為您可以運行查詢和多個聚合,並使用簡潔和簡化的API避免網絡往返,從而一次性獲得兩種(或兩種)操作的結果。
6.1、group by、count
//使用state街道對所有帳戶進行分組,然後返回按降序(也是默認值)排序的前10個(默認)狀態: GET /bank/_search { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" } } } }
相當於數據庫
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
響應結果
{ "took": 49, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 1000, "max_score": 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 } ] } } }View Code
註意,我們將size = 0設置為不顯示搜索匹配,因為我們只想查看響應中的聚合結果。
6.2、group by 、count,avg
//按state州 計算平均賬戶余額(再次僅針對按計數降序排列的前10個州): GET /bank/_search { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }
註意,如何在group_by_state聚合內嵌套average_balance聚合。這是所有聚合的通用模式。可以任意嵌套聚合內的聚合,以便從數據中提取所需的旋轉摘要。
按降序對平均余額進行排序:
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" } } } } } } } }View Code
更多聚合:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-aggregations.html
009-elasticsearch【三】示例數據導入、URI查詢方式簡介、Query DSL簡介、查詢簡述【_source、match、must、should等】、過濾器、聚合