註
Azure AI 搜尋服務 可透過 Azure 入口網站、REST API 及 Azure SDK 取得。 它同時也是 Foundry IQ 的基礎,這是一個管理式知識層,能將企業內容轉化為可重複使用、權限感知的知識庫,供 Microsoft Foundry 入口網站中的代理使用。
在 Azure AI 搜尋服務中,正規化程式是一種可預先處理文字的元件,會針對標示為「可篩選」、「可面向化」或「可排序」的欄位比對關鍵字。 與搭配文字分析器的全文「可搜尋」欄位不同,用於篩選、分類和排序操作的內容不會經過分析或分詞化。 忽略文字分析可能會導致在大小寫和字元差異出現時產生意想不到的結果,這就是為什麼你需要一個正規化工具來統一內容的差異。
透過使用正規化器,你可以達成輕度文字轉換,提升結果:
- 一致的大小寫 (例如全部小寫或大寫)
- 將重音符號和變音符號如 ö 或 ê 標準化為 ASCII 等效字元「o」和「e」。
- 將像
-和空白字元的字元映射到使用者指定的字元
正規化劑的優點
從搜尋索引中搜尋和檢索文件需要將查詢輸入與文件內容匹配。 比對會針對詞元化內容進行,如同您調用「search」時的情況;如果要求是篩選器、Facet 或 orderby 作業,則會針對非詞元化內容進行。
因為非詞元化內容也不會經過分析,所以內容中的細微差異會評估為明顯不同的值。 請考慮以下範例:
$filter=City eq 'Las Vegas'僅回傳包含完全相同文字"Las Vegas"的文件,並排除帶有"LAS VEGAS""las vegas"和 的文件,當使用情境要求所有文件不論外殼時,這就不夠了。search=*&facet=City,count:5會返回"Las Vegas","LAS VEGAS"且"las vegas"以不同值呈現,儘管它們是同一城市。search=usa&$orderby=City會以字典順序傳回城市:"Las Vegas"、"Seattle"、"las vegas",即使意圖是不論大小寫,都將相同城市排在一起。
標準化器會在索引和查詢執行時被調用,會加入輕度轉換,平滑文字中的細微差異,以適應篩選、分面和排序情境。 在前面的例子中,的 "Las Vegas" 變體會根據你選擇的正規化器來處理(例如所有文字都用小寫),以獲得更統一的結果。
如何指定正規化器
正規化工具是在索引定義中,以每個欄位為基礎,在文字欄位 (Edm.String 和 Collection(Edm.String)) 上指定,且這些欄位至少已將 「filterable」、「sortable」 或 「facetable」 屬性之一設定為 true。 設定正規化器是可選的,預設為空。 我們建議在設定自訂標準化器前,先評估預先定義的正規化器。
正規化器只有在新增索引欄位時才能指定,因此如果可能,請盡量在開發初期事先評估正規化需求,並在刪除和重新建立索引常態化的階段指派正規化器。
在索引中建立欄位定義 時,將「normalizer」屬性設為以下其中一個值:預設的 正規化器 如「lowercase」,或自訂正規化器(定義於同一索引架構中)。
"fields": [ { "name": "Description", "type": "Edm.String", "retrievable": true, "searchable": true, "filterable": true, "analyzer": "en.microsoft", "normalizer": "lowercase" ... } ]自訂正規化器先在索引的「正規化器」區段定義,然後如前一步所示指派到場定義中。 欲了解更多資訊,請參閱 建立索引 及 新增自訂正規化器。
"fields": [ { "name": "Description", "type": "Edm.String", "retrievable": true, "searchable": true, "analyzer": null, "normalizer": "my_custom_normalizer" },
註
要更改現有欄位的正規化器,請 完全重建索引 (無法重建單一欄位)。
對於在生產環境中重建索引有高昂成本的情況,一個不錯的變通方法是建立一個與舊欄位相同的新欄位,但使用新的標準化程式,並用它取代舊欄位。 使用 Update Index 來整合新欄位,並用 mergeOrUpload 來填充。 之後,作為計畫中的索引服務的一部分,你可以清理索引以移除過時欄位。
預定義與自訂正規化器
Azure AI 搜尋服務 內建標準化器,適用於常見使用情境,並具備可依需求自訂的功能。
| 分類 | 描述 |
|---|---|
| 預設正規化器 | 開箱即用,無需任何設定即可使用。 |
| 自訂正規化器1 | 針對進階情境。 需要使用者自訂配置現有元素的組合,包含字元與標記過濾器。 |
(1) 自訂正規化器不指定分詞器,因為正規化器總是產生單一標記。
測試正規化器
你可以使用 測試分析器(REST) 來觀察正規化器如何處理輸入。
請求
POST https://[search service name].search.windows.net/indexes/[index name]/analyze?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
"normalizer":"asciifolding",
"text": "Vis-à-vis means Opposite"
}
回應
HTTP/1.1 200 OK
{
"tokens": [
{
"token": "Vis-a-vis means Opposite",
"startOffset": 0,
"endOffset": 24,
"position": 0
}
]
}
正規化器參考
預設正規化器
| 名稱 | 描述與選項 |
|---|---|
| 標準 | 小寫文字後面接著 asciifolding。 |
| 小寫 | 將字元轉換為小寫。 |
| 大寫 | 將字元轉換為大寫。 |
| asciifolding | 將不在基本拉丁Unicode區塊中的字元轉換成其ASCII對應的字元(如果有的話)。 例如,將 à 改為 a。 |
| elision | 移除詞元開頭的省略。 |
支援的字元過濾器
正規化器支援兩種字元濾波器,與 自訂分析器字元濾波器中的對應元件相同:
支援的代幣過濾器
以下列表顯示了正規化器所支援的令牌過濾器,並且是 自訂分析器中整體標記過濾器的子集。
- 阿拉伯文正規化
- asciifolding
- cjk_width
- 省略
- 德文正規化
- hindi_normalization
- indic_normalization
- 波斯語標準化
- scandinavian_normalization
- scandinavian_folding
- sorani_normalization
- 小寫
- 大寫
新增自訂正規化器
自訂正規化器是在 索引結構中定義的。 定義包含名稱、類型、一個或多個字元過濾器及標記過濾器。 字元過濾器與標記過濾器是自訂正規化器的基礎,負責文字處理。 這些濾鏡是從左到右施加的。
是 token_filter_name_1 標記過濾器的名稱, char_filter_name_1 和 char_filter_name_2 是字符過濾器的名稱(有效值請參見下方 支援標記過濾器 與 支援字符過濾器表格)。
"normalizers":(optional)[
{
"name":"name of normalizer",
"@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
"charFilters":[
"char_filter_name_1",
"char_filter_name_2"
],
"tokenFilters":[
"token_filter_name_1"
]
}
],
"charFilters":(optional)[
{
"name":"char_filter_name_1",
"@odata.type":"#char_filter_type",
"option1": "value1",
"option2": "value2",
...
}
],
"tokenFilters":(optional)[
{
"name":"token_filter_name_1",
"@odata.type":"#token_filter_type",
"option1": "value1",
"option2": "value2",
...
}
]
自訂正規化器可以在建立索引時或之後透過更新現有標準化器來新增。 在現有索引中新增自訂正規化器時,必須在 更新索引 中指定「allowIndexDowntime」旗標,該索引會暫時無法使用幾秒鐘。
自訂正規化器範例
以下範例展示了自訂正規化器的定義,並包含對應的字元過濾器與標記過濾器。 字元過濾器與標記過濾器的自訂選項分別以命名結構形式指定,並在正規化器定義中如下所示引用。
一個名為「my_custom_normalizer」的自訂正規化器定義在索引定義的「正規化器」部分。
正規化器由兩個字元過濾器和三個字符過濾器組成:省略過濾器、小寫過濾器,以及自訂的 asciifolding 過濾器「my_asciifolding」。
第一個字元篩選器「map_dash」會將所有破折號換成底線,第二個「remove_whitespace」則移除所有空格。
{
"name":"myindex",
"fields":[
{
"name":"id",
"type":"Edm.String",
"key":true,
"searchable":false,
},
{
"name":"city",
"type":"Edm.String",
"filterable": true,
"facetable": true,
"normalizer": "my_custom_normalizer"
}
],
"normalizers":[
{
"name":"my_custom_normalizer",
"@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
"charFilters":[
"map_dash",
"remove_whitespace"
],
"tokenFilters":[
"my_asciifolding",
"elision",
"lowercase",
]
}
],
"charFilters":[
{
"name":"map_dash",
"@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
"mappings":["-=>_"]
},
{
"name":"remove_whitespace",
"@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
"mappings":["\\u0020=>"]
}
],
"tokenFilters":[
{
"name":"my_asciifolding",
"@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
"preserveOriginal":true
}
]
}