【Elasticsearch 7 探索之路】(五)搜索相關 Search-API

本節主要講解 Elasticsearch 的 搜索相關功能 Search-API,講解什麼是 URL Search 和 Request Body Search 的語法,對經常使用的語法都會一一進行詳細介紹。html

1.Search APIless

Search API 分爲兩大類一個是 URL Search 和 Request Body Search。學習

  • URL Search3d

    • 在 URL 中根據參數查詢結果
  • Request Body Searchcode

    • 一種基於 JSON 格式的查詢語言 Query Domain Specific Language (DSL)

2.URL Searchorm

GET /movies/_search?q=love&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
	"profile":"true"
}
  • q 指定查詢語句
  • df 指定查詢字段,不指定對全部字段進行查詢
  • Sort 排序
  • from 和 size 用於分頁
  • 若是要查詢執行過程,能夠增長 profile 爲 true

2.1Query String Syntaxhtm

2.1.1TermQueryblog

GET /movies/_search?q=title:(Beautiful Mind)
{
	"profile":"true"
}

輸出爲有 Beautiful 或者 Mind 的電影名稱排序

2.1.2PhraseQuery索引

GET /movies/_search?q=title:"Beautiful Mind"
{
	"profile":"true"
}

輸出爲按照順序同時出現 "Beautiful Mind" 這個詞語的電影名稱

TermQuery 必須帶有 () ,好比 (Beautiful Mind),不帶的狀況是不同的。

GET /movies/_search?q=title:(Beautiful Mind)

Mind 爲泛查詢,對全部字段都進行查詢

2.1.3布爾查詢

  • AND / OR / NOT 或者 && /|| / !
    • 必須大寫
    • title:(Beautiful OR Mind)
GET /movies/_search?q=title:(Beautiful OR Mind)
{
	"profile":"true"
}

裏面執行是 BooleanQuery,最後仍是以 TermQuery 進行分組查詢。

2.1.4範圍查詢

  • [] 爲閉區間,{} 爲開區間
  • year:[2018 TO 2019],查詢時間在2018-2019年的電影
GET /movies/_search?q= year:[2018 TO 2019]
{
	"profile":"true"
}

2.1.5算數查詢

  • year:>=2018,匹配電影在2018年之後的電影
GET /movies/_search?q=year:>=2018
{
	"profile":"true"
}

2.1.6通配符和正則匹配

  • ? 表明1個字符,*表明0到多個字符,這種不推薦,佔用太多空間
  • title:b*,匹配電影名稱有 b 開頭的名稱
  • title:[bu],匹配電影名稱有 b 開頭的名稱

GET /movies/_search?q=title:b*

2.1.7模糊查詢

  • "Avengers War"~2 ,Avengers 和 War 之間有兩個 term,匹配 Avengers: Infinity War - Part I,不能匹配 Avengers: War。

GET /movies/_search?q=title:"Avengers War"~2

3.Request Body Search

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

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

3.1Query DSL

POST kibana_sample_data_ecommerce/_search
{
  "profile": true,
  "_source":["customer_first_name","customer_full_name","customer_gender"],
  "from":10,
  "size":20,
  "sort":[{"order_date":"desc"}],
	"query": {
		"match_all": {}//查詢全部文檔
	}
}

  • from 和 size 進行分頁,"from":10, "size":20,from 從 10 開始,返回20個結果,不填寫時from=0,size=10
  • sort 根據某些字段進行排序,最好選擇日期或者數字的列進行排序
  • _source 當你不須要對全部字段進行查詢,經過 _source 選擇須要展現數據,不填寫則全部,)source 支持正則

3.2腳本字段

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

GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['customer_id']+'_2333333!'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

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

3.3Match 查詢表達式

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

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

若是你要要求 Who Last 要同時出現,增長 "operator": "and" 實現。

POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Who Christmas",
        "operator": "and"
      }
    }
  }
}

3.4Match Phrase

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

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

4.小結

本篇主要對 Search-Api 的 URL Search 和 Request Body Search 詳細介紹,URL Search 和 Request Body Search 均可以簡單方便查詢咱們想要的結果, 那麼咱們應該採用哪一種方式進行查詢呢?在簡單的進行查詢兩種方式沒有什麼區別,可是在 ES 中高級使用方法只能在 Request Body Search 中作,全部這裏也是推薦學習和使用這種方法,對 Request Body Search 高階使用的方法會在以後的章節進行講解。

5.數據來源

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

movies 索引是 movielens 數據集,經過https://grouplens.org/datasets/movielens/ 這個地址下載。經過 Logstash 導入。logstash.conf 和 數據文件在公衆號後臺回覆 ES 獲取。

【Elasticsearch 7 探索之路】(四)Analyzer 分析 【Elasticsearch 7 探索之路】(三)倒排索引 【Elasticsearch 7 探索之路】(二)文檔的 CRUD 和批量操做 【Elasticsearch 7 搜索之路】(一)什麼是 Elasticsearch?

原文出處:https://www.cnblogs.com/TFengStorm/p/12026562.html

相關文章
相關標籤/搜索