Elasticsearch從入門到放棄:再聊搜索

前文中咱們曾經聊過搜索文檔的方法,Elasticsearch 通常適用於讀多寫少的場景,所以咱們須要更多的關注讀操做。web

Elasticsearch 提供的 Search API 能夠分爲 URI Search 和 Request Body Search 兩大類。從名稱上能夠直觀的看出,URI Search 是使用URI的參數傳遞參數給 Elasticsearch,Request Body Search 則是將參數放到 Body 中進行傳遞,下面咱們具體來看一下。正則表達式

URI Search

首先咱們來看 URI Search 的一些參數。微信

  • q 指定查詢語句,其使用的是 Query String Syntax編輯器

  • df 指定默認字段,若是不指定,則會查詢所有字段學習

  • Sort 對哪些字段進行排序flex

  • from/size 用於分頁spa

此外,咱們還能夠經過在請求體中指定 profile 參數來查看查詢是如何被執行的。.net

你能夠在Kibana中執行下面的查詢來看一下 Elasticsearch 的查詢是怎樣執行的。3d

GET /movies/_search?q=2012
{
  "profile""true"
}

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

GET /movies/_search?q=2012&df=title
{
  "profile""true"
}

在上面這組查詢中,當咱們指定了查詢字段時, Elasticsearch 使用的 query type 是Term Query。code

term query

與之對應的還有 Phrase Query。

Term

若是咱們的查詢條件是 title:(Code Review),那麼它使用的就是 Term Query,它等價於查詢 title 中存在 Code 或 Review 的文檔。

Phrase

若是咱們的查詢條件是title:"Code Review"這樣用引號引發來的,那麼它使用的就是 Phrase Query,它等價於查詢同時存在 Code 和 Review 的文檔,而且 Code 出現的順序必須在 Review 以前。

這裏你可能會有疑問,爲何 Term Query 先後須要加括號,這是 Elasticsearch 中的分組概念,若是想要像咱們說的那樣,在 titile 字段中查找存在 Code 或 Review 的文檔,那麼就必須把它們做爲一個分組進行查詢。這裏你能夠本身動手試一下不加括號的狀況,看一下 Elasticsearch 會如何執行。

Term Query 中還提供了不少種查詢語法,例如咱們能夠只用 AND、OR、NOT 這樣的字符進行布爾操做(須要注意它們都必須大寫),也能夠使用加號或減號表示 must 和 must not 的概念。同時區間、通配符、甚至是正則表達式查詢。

Request Body Search

介紹完 URI Search,咱們再一塊兒學習一下 Request Body Search,其實在 Elasticsearch 中,Request Body Search 是更加經常使用的查詢方式。由於它可以支持更多高階的使用方法。

在 Request Body Search 中,咱們一樣是用 fromsize 來進行分頁,默認的是從0開始,返回10個結果。

排序的方法也是使用 sort,通常建議在「數字型」或「日期型」字段上進行排序。

對於一些字段比較多的文檔,咱們並非每次查詢都須要所有的字段,這時候就能夠在 body 中加上_source 字段來進行過濾。_source字段能夠支持通配符,例如_source:["name*"],查詢中就只會返回字段名是 name 開頭的字段。

前面咱們聊了 Term Query 和 Phrase Query,在 Request Body Search 中,咱們使用 Match Query 來進行相似的操做。

GET /movies/_search
{
  "query": {
    "match": {
      "title""Lord Rings"
    }
  }
}

在這個例子中,Elasticsearch 會幫咱們查詢的是 title 中有 Lord 或 Rings 的文檔,若是想要查詢 Lord 和 Rings,咱們須要用到 operator 來進行修改。

GET /movies/_search
{
  "query": {
    "match": {
      "title": {
        "query""Lord Rings",
        "operator""and"
      }
    }
  },
  "profile""true"
}

若是要使用 Phrase 查詢,只須要把上面的 match 替換爲 match_phrase 便可。

在 Phrase 查詢中,能夠使用 slot 參數來指定能夠插入在中間的單詞數量。

GET /movies/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query""Lord Rings",
        "slop"2
      }
    }
  },
  "profile""true"
}

總結

本文咱們學習了 Elasticsearch 的兩種查詢方法:URI Search 和 Request Body Search 。這裏更加推薦使用 Request Body Search,由於它能夠支持不少高階用法,這裏咱們只介紹了一些比較經常使用的查詢方法,包括 Term Query 和 Phrase Query,也介紹了一些字段的用法,包括分頁、排序、過濾字段等。固然,Elasticsearch 的 Request Body Search 還支持不少其餘參數,因爲篇幅限制,就再也不一一介紹了,你們在使用時能夠自行查閱官方文檔。

最後多說一句,關於 Elasticsearch,我也是剛剛接觸,歡迎志同道合的同窗一塊兒交流。

往期精彩回顧
Elasticsearch從入門到放棄:分詞器初印象
Elasticsearch從入門到放棄:文檔CRUD要牢記
Elasticsearch從入門到放棄:索引基本使用方法
Elasticsearch從入門到放棄:人生若只如初見

本文分享自微信公衆號 - 代碼潔癖患者(Jackeyzhe2018)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索