入門檢索中講了如何導入elastic提供的樣本測試數據,下面咱們用這些數據進一步檢索html
GET bank/_search 檢索 bank 下全部信息,包括 type 和 docsapi
GET bank/_search?q=*&sort=account_number:asc 請求參數方式檢索數組
GET /bank/_search { "query": { "match_all": {} }, "sort": [ { "account_number": "asc" } ] } # query 查詢條件 # sort 排序條件
took - 執行搜索的時間(毫秒)dom
time_out - 告訴咱們搜索是否超時elasticsearch
_shards - 告訴咱們多少個分片被搜索了,以及統計了成功/失敗的搜索分片ide
hits - 搜索結果函數
hits.total - 搜索結果條數測試
hits.hits - 實際的搜索結果數組(默認爲前 10 的文檔)優化
sort - 結果的排序 key(鍵)(沒有則按 score 排序)ui
score 和 max_score –相關性得分和最高得分(全文檢索用)
Elasticsearch 提供了一個能夠執行查詢的 Json 風格的 DSL(domain-specific language 領域特
定語言)。這個被稱爲 Query DSL。
一個查詢語句的典型結構:
QUERY_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,... }
若是針對於某個字段,那麼它的結構以下:
{ QUERY_NAME:{ FIELD_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,... } } }
請求示例
GET bank/_search { "query": { "match_all": {} }, "from":0, "size":5, "sort": [ { "balance": { "order": "desc" } } ] } #query 定義如何查詢 #match_all 查詢類型【表明查詢全部的全部】,es 中能夠在 query 中組合很是多的查詢類型完成複雜查詢 #除了 query 參數以外,咱們也能夠傳遞其它的參數以改變查詢結果。如 sort,size from+size 限定完成分頁 #sort 排序,多字段排序,會在前序字段相等時後續字段內部排序,不然之前序爲準
_source:須要返回哪些字段寫在數組中便可
GET bank/_search { "query": { "match": { "account_number": 10 } } } #match 返回 account_number=10 的
GET bank/_search { "query": { "match": { "address": "mill" } } } #最終查詢出 address 中包含 mill 單詞的全部記錄 #match 當搜索字符串類型的時候,會進行全文檢索,而且每條記錄有相關性得分
GET bank/_search { "query": { "match": { "address": "mill road" } } } #最終查詢出 address 中包含 mill 或者 road 或者 mill road 的全部記錄,並給出相關性得分(_score),也會按照這個評分排序
GET bank/_search { "query": { "match": { "address.keyword": " Mill road" } } } # 查找 address徹底爲Mill Street 的數據
GET bank/_search { "query": { "match_phrase": { "address": "mill road" } } } #查出 address 中包含 mill road 的全部記錄,並給出相關性得分
GET bank/_search { "query": { "multi_match": { "query": "mill", "fields": [ "city","address" ] } } } #檢索 city 或 address 匹配包含 mill 的數據,會對查詢條件分詞
bool 用來作複合查詢: 複合語句能夠合併任何其它查詢語句,包括複合語句,複合語句之間能夠互相嵌套,能夠表達很是複雜的邏輯
GET bank/_search { "query": { "bool": { "must": [ {"match": {"firstname": "Forbes"}}, {"match": {"gender": "M"}} ] } } }
GET bank/_search { "query": { "bool": { "must": [ {"match": {"firstname": "Forbes"}}, {"match": {"gender": "M"}} ], "must_not": [ {"match": {"lastname": "Wallace"}} ] } } }
若是達到會增長相關文檔的評分並不會改變 查詢的結果。若是 query 中只有 should 且只有一種匹配規則,那麼 should 的條件就會被做爲默認匹配條件而去改變查詢結果
GET bank/_search { "query": { "bool": { "must": [ {"match": {"address": "mill"}}, {"match": { "gender": "M" }} ], "should": [ {"match": { "address": "lane" }} ] } } } #應該匹配,匹配到能增長文檔相關性得分,匹配不到也不會影響查詢結果
不是全部的查詢都須要計算相關性得分,僅用於 「filtering」(過濾)的文檔。爲了避免計算分數 Elasticsearch 會自動檢查場景而且優化查詢的執行。
GET bank/_search { "query": { "bool": { "must": [ {"match": {"address": "mill"}} ], "filter": [ {"range": { "balance": { "gte": 10000, "lte": 20000 } }} ] } } } #range範圍查詢,大於1000小於20000
避免使用 term 查詢文本字段,默認狀況下,Elasticsearch 會經過analysis分詞將文本字段的值拆分爲一部分,這使精確匹配文本字段的值變得困難。若是要查詢文本字段值,請使用 match 查詢代替。
和 match 同樣,匹配某個屬性的值。全文檢索字段用 match,其餘非 text 字段匹配用 term
GET bank/_search { "query": { "term": { "age": "20" } } }
聚合提供了從數據中分組和提取數據的能力。最簡單的聚合方法大體等於 SQL GROUP BY 和 SQL聚合函數。
詳細的介紹能夠查看官網關於Aggregation的文檔,下面提供幾個示例來看一下聚合
https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-aggregations.html
GET bank/_search { "query": { "match": { "address": "mill" } }, "aggs": { "group_by_state": { "terms": { "field": "age" } }, "avg_age":{ "avg": { "field": "age" } } }, "size": 0 } #size:0 不顯示搜索數據 #aggs:執行聚合。聚合語法以下: #"aggs": { "aggs_name 此次聚合的名字,方便展現在結果集中": { "AGG_TYPE 聚合的類型(avg,term,terms)": { "field": "age" } } }
GET bank/_search { "query": {"match_all": {}}, "aggs": { "group_by_state": { "terms": { "field": "age" }, "aggs": { "avg_age": { "avg": { "field": "age" } } } } } } #其實就是aggs裏面又加了一個aggs,第二個aggs根據第一個aggs聚合後的結果在聚合
段的整體平均薪資
GET bank/_search { "query": {"match_all": {}}, "aggs": { "age_avg":{ "terms": { "field": "age", "size": 1000 }, "aggs": { "gender_avg": { "terms": { "field": "gender.keyword", "size": 10 }, "aggs": { "balance_avg": { "avg": { "field": "balance" } } } }, "balance_avg": { "avg": { "field": "balance" } } } } } }