2016-12-19

Azure Search - Part 7 (Azure Search Index 查詢基本介紹)

查詢參數詳細資料可以參考 Search Documents (Azure Search Service REST API)SearchParameters Class(.NET SDK),下面會先看幾個常見參數用法

查詢類型

  1. search
    • 在 index 中所有 Searchable 的欄位搜尋 一或多個 字詞
  2. filter
    • 可在多個 index 中所有 Filterable 欄位做比對
    • 需要完全符合欄位內容,大小寫視為相異

篩選運算式

OData 表達式語法 的部份集合
  1. 簡單查詢語法
  • Azure Search 的預設查詢語言,queryType=simple
  • 沒有 fuzzy/slop 選項
  • 詳細內容可以看 Simple query syntax in Azure Search
    • 1-1. AND operator +
      搜尋同時符合多個條件
    • 1-2. OR operator |
      搜尋多個條件,只要符合一個以上就可以
    • 1-3. NOT operator -
      有兩個模式(透過 searchMode 控制):
      • 符合其他條件 排除 - 條件(OR NOT)
        • searchMode=any, 預設值
      • 符合其他條件 同時 排除 - 條件(AND NOT)
        • searchMode=all
        • 搜尋效能較佳
    • 1-4. Suffix operator *
      • 搜尋特定文字開頭的內容
      • 會忽略大小寫
      • e.g.:text*,找 test 開頭內容
    • 1-5. Phrase search operator " "
      "" 內的字句視為一個字來搜尋,完全符合才會被搜到
    • 1-6. Precedence operator ( )
      在組合多種查詢運算子的情境下,可透過 ( ) 來提高優先順序
    特殊情況
    • 實際要查詢的字串中有查詢運算子時
    • 需要在查詢字串中的運算子前面加上 \ 跳脫字元,
    • NOT operator -
    只有出現在空白之後的第一個字元才需要加上 \,在字串中間的 - 不需要加
    • suffix operator *
    只有出現在空白前的最後一個字元才需要加上 \,在字串中間的 * 不需要加
  1. Lucene 查詢語法
  • queryType=full
  • 詳細內容可以看 Lucene query syntax in Azure Search
  • 適用情境
  • 指定欄位查詢(Fielded query operation)
    • 運算子需要大寫
    • 下面範例是改良官方範例來的,官方範例在 Lucene query syntax examples for building queries in Azure Search
      • 語法 1 (searchFields 可以指定搜尋欄位範圍)
        • ex: 搜尋 business_titleSenior 不是 junior(business_title:(senior NOT junior))
          api-key:252044BE3886FE4A8E3BAA4F595114BB https://azs-playground.search.windows.net/indexes/nycjobs/docs?api-version=2016-09-01&searchMode=all&queryType=full&searchFields=business_title&search=Senior NOT junior
      • 語法 2 (fieldname:searchterm)
        • api-key:252044BE3886FE4A8E3BAA4F595114BB
        • 1.搜尋 business_titleSenior 不是 junior--> business_title:(senior NOT junior)
        • 2.搜尋 work_locationN.Y.Qns --> work_location:("N.Y." OR "Qns")
            https://azs-playground.search.windows.net/indexes/nycjobs/docs?api-version=2016-09-01&searchMode=all&queryType=full&search=business_title:(senior NOT junior) AND work_location:("N.Y." OR "Qns")
          
  • 模糊搜尋(Fuzzy search)
    • 單一文字結尾加上 ~
    • 選擇性參數 0 - 2,預設值為 1 ,用來指定距離值(距離值可以參考 Damerau-Levenshtein 距離)
    • ex: 搜尋 business_title 欄位,與 asosiate(拼字有錯) 有關聯(business_title:asosiate~)
      https://azs-playground.search.windows.net/indexes/nycjobs/docs?api-version=2015-02-28-Preview&$select=business_title&queryType=full&search=business_title:asosiate~
      
    • ex: 距離值改為 0, 就是不使用模糊搜尋(business_title:asosiate~0)
      https://azs-playground.search.windows.net/indexes/nycjobs/docs?api-version=2015-02-28-Preview&$select=business_title&queryType=full&search=business_title:asosiate~0
      
  • 鄰近搜尋(Proximity Search)
    • 片語結果加上 ~
    • 參數是可接受的字數範圍
    • ex: 搜尋 business_title 欄位,內容需要有 senior analyst,且兩字最多只能相隔 2 字(business_title:"senior analyst"~2)
      http://fiddle.jshell.net/liamca/gkvfLe6s/1/?index=nycjobs&apikey=252044BE3886FE4A8E3BAA4F595114BB&query=api-version=2015-02-28-Preview%26$select=business_title%26queryType=full%26search=business_title:%22senior%20analyst%22~2
      
    • ex: 搜尋 business_title 欄位,內容需要有 senior analyst,且兩字必需相鄰(business_title:"senior analyst"~0)
      http://fiddle.jshell.net/liamca/gkvfLe6s/1/?index=nycjobs&apikey=252044BE3886FE4A8E3BAA4F595114BB&query=api-version=2015-02-28-Preview%26$select=business_title%26queryType=full%26search=business_title:%22senior%20analyst%22~0
      
  • 詞彙增強(Term Boosting)
    • 如果包含指定字句,則評等提高,排名往前(評分設定檔 是針對欄位不是字彙)
    • 使用 ^ ,並加上 提升係數(大於 0 的數字,可以有小數位),預設為 1
    • ex: 搜尋 business_title 欄位,內容需要有 computer analyst,沒有完全符合的項目, 含有 analyst 排序較前(business_title:computer analyst)
      http://fiddle.jshell.net/liamca/gkvfLe6s/1/?index=nycjobs&apikey=252044BE3886FE4A8E3BAA4F595114BB&query=api-version=2015-02-28-Preview%26$select=business_title%26queryType=full%26search=business_title:computer%20analyst
      
    • ex: 搜尋 business_title 欄位,內容需要有 computer analyst,沒有完全符合的項目,含有 computer 排序較前(computer^2 analyst)
      http://fiddle.jshell.net/liamca/gkvfLe6s/1/?index=nycjobs&apikey=252044BE3886FE4A8E3BAA4F595114BB&query=api-version=2015-02-28-Preview%26$select=business_title%26queryType=full%26search=business_title:computer%5e2%20analyst
      
  • 正則表達式(Regular Expression)
    • RegExp 語法可以參考 Class RegExp
    • ex: 搜尋 business_title 欄位,內容需要是 Sen 或是 Jun 接著 ior-->Senior 或 Junior (business_title:/(Sen|Jun)ior/)
      http://fiddle.jshell.net/liamca/gkvfLe6s/1/?index=nycjobs&apikey=252044BE3886FE4A8E3BAA4F595114BB&query=api-version=2015-02-28-Preview%26queryType=full%26$select=business_title%26search=business_title:/(Sen|Jun)ior/
      
  • 萬用字元搜尋(Wildcard Search)
    • 用於單一字彙上,不得用於片語
    • * 表多個字元
    • ? 表單一字元
    • *? 不可以當做搜尋條件的開頭
    • ex: 搜尋 business_title 欄位,內容是 prog-->program or programmer (business_title:prog*)
      http://fiddle.jshell.net/liamca/gkvfLe6s/1/?index=nycjobs&apikey=252044BE3886FE4A8E3BAA4F595114BB&query=api-version=2015-02-28-Preview%26queryType=full%26$select=business_title%26search=business_title:prog*
      

排序結果

  1. 搜尋結果預設依 搜尋分數 來排序 ,分數算法可以看 TF-IDF
  2. 可以使用 $orderby 欄位名稱 來排序
  3. asc 表遞增, desc 表遞減

分頁

  1. 透過 $top $skip 參數來指定分頁
  2. 可以 $count=true 顯示總數

HightLight

  • 只有 searchable 欄位可以被 highlight
  • 可指定欄位要強調顯示
  • 最多顯示 5 塊區塊
  1. highlight
    highlight=business_title
  2. highlightPreTag
  3. highlightPostTag
這個章節牽涉比較廣,官網上的文件也有些錯誤,要仔細留意一下

參考資料

  1. 查詢 Azure 搜尋服務索引
  2. Search Documents (Azure Search Service REST API)
  3. SearchParameters Class(.NET SDK)
  4. OData Expression Syntax for Azure Search
  5. Simple query syntax in Azure Search
  6. Lucene query syntax in Azure Search
  7. 在 Azure 搜尋服務中建置查詢的 Lucene 查詢語法範例
  8. Class RegExp
  9. TF-IDF

沒有留言:

張貼留言