ES提供了豐富多彩的查詢接口,能夠知足各類各樣的查詢要求。更多內容請參考: ELK修煉之道
舉個例子html
GET _search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "20150101" }}} ] } } }
查詢的分類 json
Leaf query Cluase 葉子查詢(簡單查詢)
這種查詢能夠單獨使用,針對指定的字段查詢指定的值。緩存
Compound query clauses 複雜查詢
複雜查詢能夠包含葉子或者其它的複雜查詢語句,用於組合成複雜的查詢語句,好比not, bool等。安全
查詢雖然包含這兩種,可是查詢的行爲還與查詢的執行環境有關,不一樣的執行環境,查詢操做也不同。
查詢的行爲取決於他們所在的查詢上下文,包括Query查詢上下文和Filter查詢上下文。框架
Query查詢上下文
在Query查詢上下文中,查詢會回答這個問題--"這個文檔匹不匹配查詢條件,它的相關性高麼?"
除了決定文檔是夠匹配,針對匹配的文檔,查詢語句還會計算一個_score
相關性分值,分數越高,匹配度越高,默認返回是越靠前。這裏關於分值的計算再也不介紹,之後再作介紹。elasticsearch
舉個簡單的例子:ide
GET _search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
性能差別
使用過濾語句獲得的結果集———一個簡單的文檔列表,快速匹配運算並存入內存是很是方便的,每一個文檔僅需1個字節。這些緩存的過濾結果集與後續請求的結合使用時很是高效的。
查詢語句不只要查找相匹配的文檔,還須要計算每一個文檔的相關性,因此通常來講查詢語句要比過濾語句更耗時,而且查詢結果也不可緩存。
幸好有了倒排索引,一個只匹配少許文檔的簡單查詢語句在百萬級文檔中的查詢效率會與一條通過緩存的過濾語句旗鼓至關,甚至略佔上風。可是通常狀況下,一條通過緩存的過濾查詢要遠勝一條查詢語句的執行效率。性能
之後博客中提到的查詢就是在Query查詢上下文,過濾就是指filter過濾器上下文。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.htmlui