1. 程式人生 > >10.Elasticsearch查詢關鍵字1

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"
    }
}

這些查詢經常用於某個欄位有值的情況和某個欄位缺值的情況。