10.Elasticsearch查詢關鍵字1
本文講解幾個查詢時常用的關鍵字:
- match_all 查詢
- match 查詢
- multi_match 查詢
- range 查詢
- term 查詢
- terms 查詢
- exists 查詢和 missing 查詢
match_all 查詢
match_all 查詢簡單的 匹配所有文件。在沒有指定查詢方式時,它是預設的查詢:
{ "match_all": {}}
它經常與 filter 結合使用–例如,檢索收件箱裡的所有郵件。所有郵件被認為具有相同的相關性,所以都將獲得分值為 1 的中性 _score
。
match 查詢
無論你在任何欄位上進行的是全文搜尋還是精確查詢,match 查詢是你可用的標準查詢。
如果你在一個全文欄位上使用 match 查詢,在執行查詢前,它將用正確的分析器去分析查詢字串:
{ "match": { "tweet": "About Search" }}
如果在一個精確值的欄位上使用它, 例如數字、日期、布林或者一個 not_analyzed 字串欄位,那麼它將會精確匹配給定的值:
{ "match": { "age": 26 }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "public": true }}
{ "match": { "tag": "full_text" }}
對於精確值的查詢,你可能需要使用 filter 語句來取代 query,因為 filter 將會被快取。後面,我們將看到一些關於 filter 的例子。
不像我們在 輕量搜尋 中介紹的字串查詢(query-string search), match 查詢不使用類似 +user_id:2 +tweet:search 的查詢語法。它只是去查詢給定的單詞。這就意味著將查詢欄位暴露給你的使用者是安全的;你需要控制那些允許被查詢欄位,不易於丟擲語法異常。
multi_match 查詢
multi_match 查詢可以在多個欄位上執行相同的 match 查詢:
{
"multi_match ": {
"query": "full text search",
"fields": [ "title", "body" ]
}
}
range 查詢
range 查詢找出那些落在指定區間內的數字或者時間:
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
被允許的操作符如下:
gt
大於
gte
大於等於
lt
小於
lte
小於等於
term 查詢
term 查詢被用於精確值 匹配,這些精確值可能是數字、時間、布林或者那些 not_analyzed 的字串:
{ "term": { "age": 26 }}
{ "term": { "date": "2014-09-01" }}
{ "term": { "public": true }}
{ "term": { "tag": "full_text" }}
term 查詢對於輸入的文字不 分析 ,所以它將給定的值進行精確查詢。
terms 查詢
terms 查詢和 term 查詢一樣,但它允許你指定多值進行匹配。如果這個欄位包含了指定值中的任何一個值,那麼這個文件滿足條件:
{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}
和 term 查詢一樣,terms 查詢對於輸入的文字不分析。它查詢那些精確匹配的值(包括在大小寫、重音、空格等方面的差異)。
exists 查詢和 missing 查詢
exists 查詢和 missing 查詢被用於查詢那些指定欄位中有值 (exists) 或無值 (missing) 的文件。這與SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本質上具有共性:
{
"exists": {
"field": "title"
}
}
這些查詢經常用於某個欄位有值的情況和某個欄位缺值的情況。