Elasticsearch之DSL常用的DSL查詢API

本文基于Elasticsearch 6.1 版本學(xué)習(xí)

Request Body Search

  • 將查詢語句通過 http request body 發(fā)送到es, 主要包含如下參數(shù):
    ? - query 符合Query DSL 語法查詢語句
    ? - from,size
    ? - timeout
    ? - sort

    ? - ...
    圖-1
  • Query DSL
    基于json定義的查詢語言,主要包含如下兩種類型:
    ? - 字段類查詢: 如term,match,range等,只針對某一個字段進(jìn)行查詢。?
    ? - 復(fù)合查詢: 如bool查詢等, 包含一個或多個字段類查詢或符合查詢語句。
  • 字段類查詢主要包括以下兩類:
    ? - 全文匹配: 針對text類型的字段進(jìn)行全文檢索,會對查詢語句先進(jìn)行分詞處理,如match,match_pharse,等query類型。
    ? - 單詞匹配:不會對查詢語句做分詞處理,直接去匹配字段的倒排索引,如term,terms,range等query類型
  • match Query
    對字段作全文檢索,最基本和常用的查詢類型,API示例如下:
    match query
    返回結(jié)果
    match query查詢流程

    ? - 通過operator參數(shù)可以控制單詞間的匹配關(guān)系,可選項為or 和 and
    operator
    以上 operator 為 and,即必須同時包含 alfred 和 way 才滿足。
    ? - 通過 minimum_should_match 參數(shù)可以控制需要匹配的單次數(shù)
    minimum_should_match
  • Match phrase Query
    對字段作檢索,有順序要求,API示例如下:
    Match phrase Query
    響應(yīng)

    ? - 通過 slop 參數(shù)可以控制單詞間的間隔
    slop
  • Query String Query
    類似于URI Search 中的 q 參數(shù)查詢
    Query String Query
    以上查詢是指查詢username字段同時包含alfred和way字段的文檔。
    Query String Query
    以上查詢是指查詢username和job字段包含alfred或者同時包含java和ruby的文檔
  • Simple Query String Query
    類似 Query String ,但是會忽略錯誤的查詢語法,并且僅支持部分查詢語法,器常用的邏輯符號如下,不能使用AND,OR,NOT 等關(guān)鍵詞
    ? +:代指 AND
    ? | :代指 OR
    ? - :代指 NOT
    Simple Query String Query
  • Term Query
    將查詢語句作為整個單詞進(jìn)行查詢,即不對查詢語句做分詞處理,如下圖所示:
    Term Query
    查詢username字段包含alfred的所有文檔
  • Terms Query
    一次傳入多個單詞進(jìn)行查詢,如下圖所示:
    Terms Query
  • Range Query
    范圍查詢主要針對數(shù)值和日期類型,如下所示:
    Range Query
    針對日期做查詢?nèi)缦拢?div id="u0z1t8os" class="image-package">
    日期查詢
針對日期提供的一種更友好的計算方式,格式如下
日期查詢
單位主要有如下幾種:

? - y - years
? - M - months
? - w- weeks
? - d - days
? - h - hours
? - m - minutes
? - s - seconds
假設(shè)now為2018-01-02 12:00:00,那么如下計算結(jié)果為:

計算公式 實際結(jié)果
now + 1h 2018-01-02 13:00:00
now - 1h 2018-01-02 11:00:00
now - 1h/d 2018-01-02 00:00:00
  • Bool Query
    布爾查詢由一個或多個布爾子句組成,主要包含如下4個:
關(guān)鍵詞 功能
filter 只過濾符合條件的文檔,不計算相關(guān)性得分
must 文檔必須符合must中所有條件,會影響相關(guān)性算分
must_not 文檔必須不符合must_not中的所有條件
should 文檔可以符合should中的條件,會影響相關(guān)性算分

Bool查詢的API如下所示:

Bool API

? - Filter
? ? es針對filter會有智能緩存,因此其執(zhí)行效率很高
? ? 做簡單的匹配查詢且不考慮算分時,推薦使用filtrer代替query等
filter

? - Must
must

? - Must_Not
must_not

? - Should
? should使用分兩種情況:
?? 1. bool查詢中只包含should,不包含must查詢。只包含should時,文檔必須滿足至少一個條件,我們通過設(shè)置minimum_should_match可以控制滿足條件的個數(shù)或者百分比
image.png

?? 2. bool查詢中同時包含should和must時,文檔不必滿足should中的條件,但是如果滿足條件,會增加相關(guān)性算分
image.png

  • Count
    獲取符合條件的文檔數(shù),endpoint為 _count, API及返回結(jié)果如下:
    count
  • Source Filtering
    過濾返回結(jié)果中的 _source中的字段,主要有如下幾種方式:
    Source Filtering
  • Sorting(排序)
    es默認(rèn)會采用相關(guān)性算分排序,用戶可以通過設(shè)定 sorting 參數(shù)來自定義排序規(guī)則,api 如下:
    排序
    排序

    按照字符串排序比較特殊,因為 es 有 text 和 keyword 兩種類型,針對text 類型排序,會報錯,如下圖所示:
    排序
    我們可以設(shè)置Fielddata參數(shù)來實現(xiàn),F(xiàn)ielddata 默認(rèn)是關(guān)閉的,可以通過以下API進(jìn)行開啟:
    Fielddata

    針對keyword類型排序,可以返回預(yù)期的結(jié)果:
    keyword 排序
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容