模糊搜尋以更正拼錯和錯字

Azure AI 搜尋支援模糊搜尋,這是一種查詢類型,可補償輸入字串中的錯字和拼錯字詞。 模糊搜尋會掃描具有類似組合的字詞。 展開搜尋以涵蓋接近相符專案,當差異只是幾個錯位字元時,自動更正錯字的效果。

這是一個查詢擴充練習,可針對具有類似組合的詞彙產生相符專案。 指定模糊搜尋時,搜尋引擎會針對查詢中的所有詞彙,建置類似組成詞彙的圖表(以決定性有限自動化理論為基礎)。 例如,如果您的查詢包含三個詞彙,則會針對查詢search=university~ of~ washington~中的每個字詞"university of washington"建立圖表(模糊搜尋中沒有停用字詞移除,因此"of"會取得圖表)。

此圖表包含每個詞彙最多50個擴充或排列,同時擷取程式中的正確和不正確的變體。 然後引擎會傳回回應中最上層的相關相符專案。

對於類似「大學」的字詞,圖表可能有 "unversty, universty, university, universe, inverse"。 圖表中符合的任何檔都包含在結果中。 與其他分析文字以處理不同形式的相同單字 (“mouse” 和 “mouse” ) 的查詢相反,模糊查詢中的比較會以臉部值進行,而不會對文字進行任何語言分析。 “Universe” 和 “inverse” 在語意上不同,會比對,因為語法差異很小。

如果差異限制為兩個或更少的編輯,其中編輯是插入、刪除、取代或轉置字元,則比對成功。 指定差異的字串更正演算法是 Damerau-Levenshtein 距離 計量。 其描述為「將一個單字變更為另一個字所需的最少作業數目(插入、刪除、替代或換行)。

在 Azure AI 搜尋中:

  • 模糊查詢適用於整個詞彙。 不支援直接使用片語,但您可以透過AND建構,針對多部分片語的每個字詞指定模糊比對。 例如: search=dr~ AND cleanin~ 。 此查詢表達式會尋找「清除」上的相符專案。

  • 編輯的預設距離為 2。 的值 ~0 表示沒有展開(只有確切的字詞視為相符專案),但您可以指定 ~1 一度的差異,或一次編輯。

  • 模糊查詢可將詞彙擴充到最多 50 個排列。 無法設定此限制,但您可以將編輯距離減少為 1,以有效減少展開數目。

  • 回應是由包含相關相符專案的檔所組成(最多 50 份)。

在查詢處理期間,模糊查詢不會進行 語彙分析。 查詢輸入會直接新增至查詢樹狀結構,並展開以建立字詞圖表。 執行的唯一轉換是較低的大小寫。

整體上,圖表會以符合索引中標記的準則送出。 如您所想像,模糊搜尋本質上比其他查詢窗體慢。 索引的大小和複雜度可以判斷優點是否足以抵消響應的延遲。

注意

由於模糊搜尋往往很慢,因此可能值得調查 n-gram 索引等替代專案,其短字元序列的進展(bigram 和 trigram 標記的兩個字元序列和三個字元序列)。 根據您的語言和查詢介面,n-gram 可能會為您提供更好的效能。 取捨在於 n-gram 索引編製非常密集,而且會產生更大的索引。

另一個替代方案,如果您想要只處理最令人震驚的案例,則可以考慮這是 同義字對應。 例如,將 “search” 對應至 “serach、serch、sarch” 或 “retrieve” 至 “retreive”。

屬性為「可搜尋」的字串字段是模糊搜尋的候選專案。

分析器不會用來建立擴充圖表,但這並不表示在模糊搜尋案例中應該忽略分析器。 分析器對於索引編製期間令牌化很重要,其中反轉索引中的令牌會用來比對圖形。

一如往常,如果測試查詢未產生您預期的相符專案,請試驗不同的索引分析器。 例如,請嘗試 語言分析器 來查看您是否取得更好的結果。 某些語言,特別是具有元音素突變的語言,可以受益於 Microsoft 自然語言處理器所產生的變化和不規則的文字形式。 在某些情況下,使用正確的語言分析器可能會改變字詞是否以與使用者所提供的值相容的方式進行標記化。

模糊查詢是使用完整的 Lucene 查詢語法來建構的,叫用 完整的 Lucene 查詢剖析器,並在使用者輸入的每個整個字詞之後附加一個底線字元 ~

以下是叫用模糊搜尋的查詢要求範例。 其中包含四個字詞,其中兩個字詞拼錯:

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "seatle~ waterfront~ view~ hotle~",
    "queryType": "full",
    "searchMode": "any",
    "searchFields": "HotelName, Description",
    "select": "HotelName, Description, Address/City,",
    "count": "true"
}
  1. 將查詢類型設定為完整的 Lucene 語法 (queryType=full)。

  2. 提供查詢字串,其中每個字詞後面接著每個整個字詞結尾的 tilde (~) 運算子。search=<string>~ 系統會針對查詢輸入中的每個字詞建立展開圖。

    如果您要指定編輯距離 (), 請包含選擇性參數,數位介於 0 到 2 之間(~1預設值)。 例如,“blue~” 或 “blue~1” 會傳回 “blue”、“blues” 和 “glue”。

您可以選擇性地將要求範圍設定為特定欄位,以改善查詢效能。 searchFields使用 參數指定要搜尋的欄位。 您也可以使用 select 屬性來指定查詢回應中傳回的欄位。

針對簡單的測試,建議 搜尋總管REST 用戶端 逐一查看查詢表達式。 這兩個工具都是互動式的,這表示您可以快速逐步執行字詞的多個變體,並評估回來的回應。

當結果模棱兩可時, 點擊醒目 提示可協助您識別回應中的相符專案。

注意

使用點擊醒目提示來識別模糊相符專案有限制,而且僅適用於基本模糊搜尋。 如果您的索引具有評分配置檔,或您以更多語法分層查詢,點擊醒目提示可能無法識別相符專案。

範例 1:具有確切字詞的模糊搜尋

假設下列字串存在於 "Description" 搜尋檔中的欄位中: "Test queries with special characters, plus strings for MSFT, SQL and Java."

從「特殊」模糊搜尋開始,並將點擊醒目提示新增至 [描述] 字段:

search=special~&highlight=Description

在回應中,因為您已新增點擊醒目提示,因此格式設定會套用至「特殊」作為比對字詞。

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

再次嘗試要求,並拿出數封信來拼錯「特殊」("pe"):

search=scial~&highlight=Description

到目前為止,對回應沒有改變。 假設預設值為 2 度距離,從「特殊」移除兩個字元 "pe" 仍然允許在該字詞上成功比對。

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

再嘗試一個要求,藉由取出最後一個字元來進一步修改搜尋字詞,總共有三個刪除專案(從“特殊”到 "scal"):

search=scal~&highlight=Description

請注意,會傳回相同的回應,但現在不會比對 「特殊」,模糊比對位於 「SQL」。。

"@search.score": 0.4232868,
"@search.highlights": {
    "Description": [
        "Mix of special characters, plus strings for MSFT, <em>SQL</em>, 2019, Linux, Java."
    ]
}

此展開範例的重點是說明叫用醒目提示可能會帶來模棱兩可的結果的清晰性。 在所有情況下,都會傳回相同的檔。 如果您依賴文件識別碼來驗證相符專案,您可能錯過了從「特殊」到「SQL」的轉變。

另請參閱