Elasticsearch核心技術與實戰學習筆記 第三章 16 | Request Body與Query DSL簡介

一 序

   本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。

其實在高階使用方法上只有 Request Body Search 才能實現,所以也是推薦使用這種方法查詢學習。

二 Request Body Search

Request Body Search 將查詢語句通過通過 HTTP 方式發送到 ES,進行查詢。

2.1Query DSL

POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile":true,
"query":{
   "match_all" : {}  // 查詢所有的文檔
}
}

profile:                "type" : "MatchAllDocsQuery",
                "description" : "*:*",

分頁:

  • From 從 0 開始 默認返回 10 個結果
  • 獲取靠後的翻頁,成本較高
POST /kibana_sample_data_ecommerce/_search
{
  "from":10,
  "size":20,
  "query":{
    "match_all": {}
  }
}

排序:

GET kinaba_sample_data_ecommerce/_search
{
  "sort":[{"order_date":"desc}],
  "from":10,
  "size":5,
   "query":{
   "match_all":{}
}

sort 根據某些字段進行排序,最好選擇日期或者數字的列進行排序

_source 當你不需要對所有字段進行查詢,通過 _source 選擇需要展示數據,不填寫則所有,)source 支持正則

#source filtering
POST kibana_sample_data_ecommerce/_search
{
  "_source":["order_date"],//只顯示order_date字段
  "query":{
    "match_all": {}
  }
}

2.2 腳本字段

   腳本字段簡單說通過 ES 的 painless 腳本去算出一個新的字段。這個有什麼用處呢?當你要對一個列排序,發現存儲的有不同的單位,需要轉換之後才能做一個統一的排序。

#腳本字段
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'hello'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

用例:訂單中有不同的匯率,需要結合匯率對訂單價格進行排序。

腳本字段不要選擇文本類型,默認禁止,可以通過設置 fielddata = true 開啓,不建議。

2.3Match 查詢表達式

前面 URL Search 中講解 Term 和 Phrase 查詢,現在我們來看在 Request Body Search 是怎麼實現。

  • 使用 quest-match 方式,下一層填寫具體查詢內容,
  • 查詢內容兩個字符串,類似於 OR 方式。
POST movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

相當於 OR ,如果你要要求 Who Last 要同時出現,增加 "operator": "and" 實現。

2.4Match Phrase

  • 通過使用 query-match_phrase 實現 Phrase 查詢
  • query 的詞必須按照順序排列
  • slop 實現模糊查詢,slop=1,表示中間可以有一個字符
POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love"

      }
    }
  }
}

沒有搜索結果。

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "Who Christmas",
        "slop": 1
      }
    }
  }
}

小結

URL Search 和 Request Body Search 都可以簡單方便查詢我們想要的結果, 那麼我們應該採用哪種方式進行查詢呢?在簡單的進行查詢兩種方式沒有什麼區別,但是在 ES 中高級使用方法只能在 Request Body Search 中做,所有這裏也是推薦學習和使用這種方法。

數據:需導入Movie測試數據,具體參考“2.4-Logstash安裝與導入數據”

kibana_sample_data_ecommerce 索引是 kibana 自帶的索引,需要手動在 kibana 進行點擊導入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章