Elasticsearch 提供了豐富的查詢過濾語句,本文整理了一些經常使用的查詢方法。算法
ES 有兩種查詢方式。本文主要介紹基於DSL語法的查詢緩存
match 是一個標準查詢,能夠查詢文本、數字、日期格式的數據。match 查詢的一個主要用途是全文檢索。ES 5.X 以上的版本默認使用BM25算法進行類似度的計算less
GET /_search { "query": { "match" : { "message" : "hello world" } } }
match_phrase 與match查詢不一樣,它是精確匹配elasticsearch
GET /_search { "query": { "match_phrase" : { "message" : "this is a test" } } }
multi_match 容許在作match 查詢的基礎上查詢多個字段post
GET /_search { "query":{ "multi_match": { "query": "full text search", "fields": [ "title", "body" ] } } }
term 用於精確值的查詢。使用boost參數能夠提升指定字段的分數。boost的默認值爲1。this
string類型的數據在ES中能夠使用text或者keyword的類型來存儲。ES存儲text類型的數據時會自動分詞,而後創建索引。keyword存儲數據時,不會分詞,直接創建索引。若是須要對string數據進行精確查詢,應該使用keyword的類型來存儲數據。url
GET /_search { "query":{ "bool":{ "should":[ { "term":{ "status":{ "value":"urgent", "boost":2 } } }, { "term":{ "status":"normal" } } ] } } }
terms 能夠指定一個字段的多個精確值。code
GET /_search { "query": { "constant_score" : { "filter" : { "terms" : { "user" : ["kimchy", "elasticsearch"]} } } } }
range 用於須要查詢指定範圍的內容。range 的經常使用參數有gte (greater-than or equal to), gt (greater-than) ,lte (less-than or equal to) 和 lt (less-than)。ES 的date類型的數值也能夠使用range查詢。orm
GET /_search { "query": { "range" : { "age" : { "gte" : 10, "lte" : 20, "boost" : 2.0 } } } }
exists 返回在原始字段匯中至少有一個非空值的文檔索引
GET /_search { "query": { "exists" : { "field" : "user" } } }
prefix 前綴查詢
GET /_search { "query": { "prefix": { "postcode": "W1" } } }
bool 查詢能夠合併多個過濾條件查詢的結果。bool 查詢可由 must, should, must not, filter 組合完成
GET /_search { "query":{ "bool":{ "must":{ "term":{ "user":"kimchy" } }, "filter":{ "term":{ "tag":"tech" } }, "must_not":{ "range":{ "age":{ "gte":10, "lte":20 } } }, "should":[ { "term":{ "tag":"wow" } }, { "term":{ "tag":"elasticsearch" } } ] } } }