ES 筆記八:URI Search 詳解

CrazyZard發表於2019-10-16

通過URI query 實現搜尋

GET /users/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
  "profile": "true"
}
  • q指定查詢語句,使用Query String Syntax
  • df 預設欄位,不指定時
  • Sort 排序 / from 和size 用於分頁
  • Profile 可以檢視查詢時如何被執行的

Query String Synctax

  • 指定欄位 vs 泛查詢

    • q=title:2012 / q=2012
      
      //只對title欄位進行查詢
      GET  /movies/_search?q=2012&df=title

    //泛查詢 ,正對_all ,所有欄位
    GET /movies/_search?q=2012
    {
    "profile": "true"
    }

    //對自定欄位進行查詢 跟 df 等效
    GET /movies/_search?q=title:2012
    {
    "profile": "true"
    }

  • Term vs Phrase

    • Beautiful Mind 等效於 Beautiful OR Mind
    • "Beautiful Mind",等效於Beautiful AND Mind。Phrase 查詢,還要求前後順序儲存一致
      
      //使用引號。Phrase
      GET  /movies/_search?q=title:"Beautiful Mind"
      {
      "profile": "true"
      }

    //查詢美麗心靈,Mind為泛查詢
    // 意思就是說 title 是Term 查詢 "Beautiful" ,對所有欄位查詢"Mind"
    GET /movies/_search?q=title:Beautiful Mind
    {
    "profile": "true"
    }

  • 分組和引號

    • title:(Beautiful AND Mind)
    • title="Beautiful Mind"
      //分組,Bool 查詢 type:BooleanQuery
      GET  /movies/_search?q=title:(Beautiful Mind)
      {
      "profile": "true"
      }
  • 布林操作

    • AND / OR / NOT 或者 && / || / !
    • 必須大寫
    • title:(matrix NOT reloaded)
      
      // type:BooleanQuery
      // title 裡面必須包括Beautiful 跟 Mind
      GET  /movies/_search?q=title:(Beautiful AND Mind)
      {
      "profile": "true"
      }

    // type:BooleanQuery
    //必須包括Beautiful 但不包括 Mind
    GET /movies/_search?q=title:(Beautiful NOT Mind)
    {
    "profile": "true"
    }

    // type:BooleanQuery
    //包括Beautiful必須有Mind
    GET /movies/_search?q=title:(Beautiful %2BMind)
    {
    "profile": "true"
    }

  • 分組

    • +表示 must
    • -表示 must_not
    • title:(+matrix -reloaded)
  • 範圍查詢

    • 區間表示:[] 閉區間 ,{} 開區間
      • year:{2019 TO 2018}
      • year:[* TO 2018]
  • 算數符號

    • year:>2010
    • year(>2010 && <=2018)
    • year:(+>2010 +<=2018)
      //範圍查詢,區間寫法  / 數學寫法
      GET  /movies/_search?q=year:>=1980
      {
      "profile": "true"
      }
  • 萬用字元查詢(萬用字元查詢效率低,佔用內容大,不建議使用。特別是放在最前面)

    • ?代表1個字元,* 代表0 或多個字元
      • title:mi?d
      • title:be*
        //萬用字元查詢
        GET  /movies/_search?q=ttile:b*
        {
        "profile": "true"
        }
    • 正則表達
      • title:[bt]oy
    • 模糊匹配與近似查詢
      • title:befutifl~1
      • title:"lord rings" ~2
        //模糊匹配 
        //使用者輸錯,還能找到
        GET  /movies/_search?q=ttile:beautifl~1
        {
        "profile": "true"
        }
        // 近似度匹配 可查出    Lord of the Rings
        GET  /movies/_search?q=ttile:"Lord Rings" ~2
        {
        "profile": "true"
        }

相關文章