Elasticsearch Query DSL 整理總結(一)—— Query DSL 概要,MatchAllQuery,全文查詢簡述

引言

雖然以前作過 elasticsearch 的項目,可是沒有對整個項目的知識點進行過系統的整理。此次趁着對 elasticsearch 版本的升級的機會(從2.2 升級到 6.3) ,又專門花時間對涉及到的知識點從新梳理了一遍。json

俗話說,好記性不如爛筆頭。爲了加深對 elasticsearch 的理解,後面再作相似項目時更容易撿起來,以及對用到的同窗提供方便。從本文開始,我會對 elasticsearch Query DSL 的知識點進行梳理。dom

在講解時我會盡可能以實例代碼展現的方式進行最直觀的展示。紙上來得終覺淺,絕知此事要躬行。作技術尤爲要注重多實踐,懂了並不表明你就掌握了。強烈建議有志於深刻了解這部份內容的同窗,對文中給出的代碼實例在 sense 中實踐一遍甚至是多遍。elasticsearch

注意: 本文基於 elasticsearch 6.3 版本, 若是您使用的是其餘版本,一些內容可能會有所變化,具體使用時還請以官方文檔爲準ide

Query DSL 是 elasticsearch 的核心,搜索方面的項目大部分時間都耗費在對查詢結果的調優上。所以對 Query DSL 的理解越深刻,越能節省項目時間,並給用戶好的體驗。ui

概要

Elasticsearch 提供了一個完整的 query DSL,而且是 JSON 形式的。它和 AST 比較相似,而且包含兩種類型的語句:code

  • 葉子查詢語句(Leaf Query)htm

    用於查詢某個特定的字段,如 match , termrangeci

  • 複合查詢語句 (Compound query clauses)文檔

    用於合併其餘的葉查詢或複合查詢語句,也就是說複合語句之間能夠嵌套,用來表示一個複雜的單一查詢

DSL (domain-specific language),領域特定語言指的是專一於某個應用程序領域的計算機語言,又譯做領域專用語言。不一樣於普通的跨領域通用計算機語言(GPL),領域特定語言只用在某些特定的領域。

AST(abstract syntax tree), 抽象語法樹是源代碼的抽象語法結構的樹形表現形式。樹上的每一個節點都表示源代碼中的一種結構。之因此說語法是「抽象」的,是由於這裏的語法並不會表示出真實語法中出現的每一個細節。好比,嵌套括號被隱含在樹的結構中,並無以節點的形式呈現;而相似於if-condition-then這樣的條件跳轉語句,可使用帶有兩個分支的節點來表示。

——百度百科

Query and filter context

一個查詢語句究竟具備什麼樣的行爲和獲得什麼結果,主要取決於它究竟是處於查詢上下文(Query Context) 仍是過濾上下文(Filter Context)。二者有很大區別,咱們來看下:

  • Query context 查詢上下文

    這種語句在執行時既要計算文檔是否匹配,還要計算文檔相對於其餘文檔的匹配度有多高,匹配度越高,*_score* 分數就越高

  • Filter context 過濾上下文

    過濾上下文中的語句在執行時只關心文檔是否和查詢匹配,不會計算匹配度,也就是得分。

下面來看一個例子

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

對上面的例子分析下:

  1. query 參數表示整個語句是處於 query context 中
  2. boolmatch 語句被用在 query context 中,也就是說它們會計算每一個文檔的匹配度(_score)
  3. filter 參數則表示這個子查詢處於 filter context 中
  4. filter 語句中的 termrange 語句用在 filter context 中,它們只起到過濾的做用,並不會計算文檔的得分。

Match All Query

這個查詢最簡單,全部的 _score 都是 1.0。

GET /_search
{
    "query": {
        "match_all": {}
    }
}

它的反面就是 Match None Query, 匹配不到任何文檔(不知道用它來作什麼……)

GET /_search
{
    "query": {
        "match_none": {}
    }
}

全文查詢 Full text queries

全文本查詢的使用場合主要是在出現大量文字的場合,例如 email body 或者文章中搜尋出特定的內容。

全文查詢主要分爲下面幾種(此處列表中的連接爲官方文檔連接,後續將各部分講解後,會替換爲講解連接):

  • match query

    全文查詢中最主要的查詢,包括模糊查詢(fuzzy matching) 或者臨近查詢(proximity queries)。

  • match_phrase query

    match 查詢比較相似,可是它會保留包含全部搜索詞項,且位置與搜索詞項相同的文檔。

  • match_phrase_prefix query

    是一種輸入即搜索(search-as-you-type) 的查詢,它和 match_phrase 比較相似,區別就是會將查詢字符串的最後一個詞做爲前綴來使用。

  • multi_match query

    多字段版本的 match query

  • common terms query

    只知道是一種特殊的查詢,具體幹什麼還不清楚,後面弄明白後會再來補充。

  • query_string query

    支持複雜的 Lucene query String 語法,除非你是專家用戶,不然不推薦使用。

  • simple_query_string query

    簡化版的 query_string ,語法更適合用戶操做。

小結

本文主要講解了 elasticsearch es 6.3 版本的 Query DSL 概要,Match All Query ,

全文查詢概要等內容。下篇會介紹全文查詢中的 Match 語句,敬請期待。

參考文檔

  1. elasticsearch 6.3 query-dsl
相關文章
相關標籤/搜索