Azure AI 搜尋服務中用於文字處理的分析器
「分析器」是全文搜尋引擎的元件,在編製索引和查詢執行期間負責處理字串。 文字處理 (也稱為語彙分析) 具有變革性,透過如下動作修改字串:
- 移除非必要字組 (停用字詞) 和標點符號
- 將片語和連字號字組分割成組件
- 將任何大寫字組改成小寫
- 將字組減少至原始字根形式,以提升儲存效率,以便不論時態為何,都可以找到相符項目
分析會套用至 Edm.String
標示為「可搜尋」的欄位,表示全文檢索搜尋。
針對此設定的欄位,分析會在建立權杖時於編製索引期間發生,然後在剖析查詢時再次於查詢執行期間發生,而且引擎會掃描是否有相符的權杖。 當相同的分析器用於編製索引和查詢時,更可能出現相符項目,但您可以獨立地針對每個工作負載設定分析器,取決於您的需求。
「不是」全文檢索搜尋的查詢類型 (例如篩選條件或模糊搜尋) 不會經歷查詢端的分析階段。 相反地,剖析器會使用您提供作為比對基礎的模式,直接將這些字串傳送至搜尋引擎。 一般而言,這些查詢表單需要整個字串權杖,才能讓模式比對運作。 若要在編製索引期間確保完整保留字詞權杖,您可能需要自訂分析器。 如需何時和為何分析查詢字詞的詳細資訊,請參閱 Azure AI 搜尋服務中的全文檢索搜尋。
如需語彙分析的詳細背景,請收聽下列影片剪輯以取得簡短說明。
預設分析器
在 Azure AI 搜尋服務中,系統會在標示為可搜尋的所有字串欄位上自動叫用分析器。
依預設,Azure AI 搜尋服務會使用 Apache Lucene 標準分析器 (標準 Lucene),該分析器會遵循「Unicode 文字分割」規則將文字分為數個元素。 標準分析器會將所有字元轉換為其小寫形式。 已編製索引的文件和搜尋字詞在編製索引和查詢處理期間都會執行分析。
您可以逐欄覆寫預設值。 替代分析器為:
分析器類型
下列清單說明 Azure AI 搜尋服務中可用的分析器。
類別 | 描述 |
---|---|
標準 Lucene 分析器 | 預設。 不需要任何規格或設定。 這個一般用途的分析器對於許多語言和案例都能順利執行。 |
內建分析器 | 依原狀取用,並依名稱參考。 有兩種類型:語言和與語言無關。 特製化 (不受限於語言) 分析器適用於文字輸入需要特殊處理或最少處理時。 此類別中的分析器範例包括 Asciifolding、關鍵字、模式、簡單、停止、空白字元。 語言分析器適用於您需要為個別語言提供豐富的語言支援時。 Azure AI 搜尋服務支援 35 個 Lucene 語言分析器和 50 個 Microsoft 自然語言處理分析器。 |
自訂分析器 | 意指結合現有元素的使用者定義組態,包括一個權杖化工具 (必要) 和選擇性篩選條件 (Char 或權杖)。 |
一些內建分析器 (例如模式或停止) 可支援一組有限的設定選項。 若要設定這些選項,請建立自訂分析器,其中包含內建分析器和其中一個記載於內建分析器中的替代選項。 如同任何自訂組態,為您的新組態提供名稱,例如 myPatternAnalyzer,以便與 Lucene 分析器有所區別。
指定分析器
設定分析器是選擇性的。 一般規則是首先嘗試使用預設標準 Lucene 分析器來查看其執行方式。 如果查詢無法傳回預期的結果,切換至不同的分析器通常是正確的解決方案。
定義欄位時,請將其「analyzer」屬性設定為下列其中一項:關鍵字之類的內建分析器、
en.microsoft
之類的語言分析器,或自訂分析器 (定義在相同索引結構描述中)。"fields": [ { "name": "Description", "type": "Edm.String", "retrievable": true, "searchable": true, "analyzer": "en.microsoft", "indexAnalyzer": null, "searchAnalyzer": null },
如果您使用語言分析器,則必須使用「analyzer」屬性來指定該分析器。 「searchAnalyzer」和「indexAnalyzer」屬性不適用於語言分析器。
或者,設定 "indexAnalyzer" 和 "searchAnalyzer",以改變每個工作負載的分析器。 這些屬性會一起運作,做為「analyzer」屬性的替代項目,其必須是 Null。 如果其中一個活動需要其他活動所不需的特定轉換,您可能會使用不同的分析器進行索引編製和查詢。
"fields": [ { "name": "ProductGroup", "type": "Edm.String", "retrievable": true, "searchable": true, "analyzer": null, "indexAnalyzer": "keyword", "searchAnalyzer": "standard" },
新增分析器的時機
新增並指派分析器的最佳時機是在有效開發期間內,當卸除並重建索引為例行工作時。
因為分析器是用來將字詞權杖化,所以您應該在建立欄位時指派分析器。 事實上,不允許將分析器或 indexAnalyzer 指派給已實際建立的欄位 (雖然您可以隨時變更 searchAnalyzer 屬性,這不會影響到索引)。
若要變更現有欄位的分析器,您必須卸除並重新建立整個索引 (您無法重建個別欄位)。 對於生產環境中的索引,您可以建立新欄位來延遲重建,並指派新的分析器,然後開始使用新欄位取代舊欄位。 使用更新索引來合併新欄位,以及使用 mergeOrUpload 來填入資料。 稍後,您可以清除索引以移除過時的欄位,當作規劃索引服務的一部分。
若要將新欄位加入至現有索引,請呼叫更新索引來新增欄位,以及呼叫 mergeOrUpload 來填入該欄位。
若要將自訂分析器新增至現有的索引,請在更新索引中傳遞 "allowIndexDowntime" 旗標,如果您想要避免下列錯誤的話:
"Index update not allowed because it would cause downtime. In order to add new analyzers, tokenizers, token filters, or character filters to an existing index, set the 'allowIndexDowntime' query parameter to 'true' in the index update request. Note that this operation will put your index offline for at least a few seconds, causing your indexing and query requests to fail. Performance and write availability of the index can be impaired for several minutes after the index is updated, or longer for very large indexes."
使用分析器的建議
本節提供如何使用分析器的建議。
一個用於讀寫的分析器,除非您有特定的需求
Azure AI 搜尋服務可讓您指定不同的分析器來編製索引,並透過 "indexAnalyzer" 和 "searchAnalyzer" 欄位屬性進行搜尋。 如果未指定,設有 analyzer 屬性的分析器將用於編製索引和搜尋。 若未指定分析器,就會使用標準 Lucene 分析器。
一般規則是使用索引和查詢的相同分析器,除非特定需求另有指示。 請務必徹底測試。 當搜尋和索引時的文字處理不同,會有查詢字詞和索引字詞不符的風險,因為搜尋和索引分析器的設定不一致。
在開發期間進行測試
覆寫標準分析器需要重建索引。 可能的話,請先決定要在開發期間使用的作用中分析器,然後才將索引實際執行。
檢查權杖化字詞
若搜尋作業無法傳回預期中的結果,則查詢的字詞輸入以及索引中的權杖化字詞之間,極有可能發生權杖不相符的狀況。 若權杖不相同,則比對作業無法實行。 若要檢查權杖化工具輸出,建議使用分析 API 做為調查工具。 回應由權杖組成,一如特定分析器所產生的權杖。
REST 範例
下列範例會顯示幾個重要情節的分析器定義。
自訂分析器範例
此範例會使用自訂選項來說明分析器定義。 Char 篩選、安全性權杖和權杖篩選條件會個別指定為具名的建構,然後在分析器定義中加以參考。 預先定義的元素會依現狀使用,並依名稱加以參考。
逐步解說這個範例:
分析器是可搜尋欄位的欄位類別屬性。
自訂分析器是索引定義的一部分。 它可能是小幅自訂 (例如,在一個篩選條件中自訂單一選項) 或在多個位置中加以自訂。
在此情況下,自訂分析器是 "my_analyzer",會依次使用自訂的標準權杖化工具 "my_standard_tokenizer" 和兩個權杖篩選條件:小寫和自訂的 asciifolding 篩選條件 "my_asciifolding"。
此外,其中也會定義 2 個自訂 char 篩選條件「map_dash」和「remove_whitespace」。 第一個會以底線取代所有的連字號,而第二個則會移除所有空格。 空間必須在對應規則中以 UTF-8 編碼。 權杖化之前會套用 Char 篩選條件,而且Char 篩選條件會影響所產生的權杖 (標準權杖化工具會在虛線和空格中斷,而不會在底線中斷)。
{
"name":"myindex",
"fields":[
{
"name":"id",
"type":"Edm.String",
"key":true,
"searchable":false
},
{
"name":"text",
"type":"Edm.String",
"searchable":true,
"analyzer":"my_analyzer"
}
],
"analyzers":[
{
"name":"my_analyzer",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"charFilters":[
"map_dash",
"remove_whitespace"
],
"tokenizer":"my_standard_tokenizer",
"tokenFilters":[
"my_asciifolding",
"lowercase"
]
}
],
"charFilters":[
{
"name":"map_dash",
"@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
"mappings":["-=>_"]
},
{
"name":"remove_whitespace",
"@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
"mappings":["\\u0020=>"]
}
],
"tokenizers":[
{
"name":"my_standard_tokenizer",
"@odata.type":"#Microsoft.Azure.Search.StandardTokenizerV2",
"maxTokenLength":20
}
],
"tokenFilters":[
{
"name":"my_asciifolding",
"@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
"preserveOriginal":true
}
]
}
每個欄位的分析器指派範例
預設值為標準分析器。 假設您需要將預設值取代為不同的預先定義分析器,例如模式分析器。 如果您未設定自訂選項,就只需要在欄位定義中依名稱加以指定。
「分析器」元素會以各欄位方式來覆寫標準分析器。 沒有通用的覆寫。 在此範例中,text1
會使用模式分析器和 text2
(其中並未指定分析器) 來使用預設值。
{
"name":"myindex",
"fields":[
{
"name":"id",
"type":"Edm.String",
"key":true,
"searchable":false
},
{
"name":"text1",
"type":"Edm.String",
"searchable":true,
"analyzer":"pattern"
},
{
"name":"text2",
"type":"Edm.String",
"searchable":true
}
]
}
混合編製索引和搜尋作業的分析器
API 包含索引屬性,可針對索引和搜尋指定不同的分析器。 必須將 searchAnalyzer 和 indexAnalyzer 屬性指定為一組,從而取代單一 analyzer 屬性。
{
"name":"myindex",
"fields":[
{
"name":"id",
"type":"Edm.String",
"key":true,
"searchable":false
},
{
"name":"text",
"type":"Edm.String",
"searchable":true,
"indexAnalyzer":"whitespace",
"searchAnalyzer":"simple"
},
],
}
語言分析器範例
包含不同語言之字串的欄位可以使用語言分析器,而其他欄位則是保留預設值 (或使用一些其他的預先定義或自訂分析器)。 如果您是使用語言分析器,就必須將它用於索引和搜尋作業。 使用語言分析器的欄位不能具有索引和搜尋的不同分析器。
{
"name":"myindex",
"fields":[
{
"name":"id",
"type":"Edm.String",
"key":true,
"searchable":false
},
{
"name":"text",
"type":"Edm.String",
"searchable":true,
"indexAnalyzer":"whitespace",
"searchAnalyzer":"simple"
},
{
"name":"text_fr",
"type":"Edm.String",
"searchable":true,
"analyzer":"fr.lucene"
}
],
}
C# 範例
如果您是使用 .NET SDK 程式碼範例,則可以附加這些範例以使用或設定分析器。
指派語言分析器
任何依原狀使用且沒有設定的分析器是在欄位定義上指定的。 在索引的 [analyzers] 區段中建立項目,沒有任何需求。
語言分析器是以現況使用。 若要使用它們,請呼叫 LexicalAnalyzer,同時指定 LexicalAnalyzerName 類型,以提供 Azure AI 搜尋服務中支援的文字分析器。
自訂分析器同樣是在欄位定義上指定的,但若要這樣做,您必須在索引定義中指定分析器,如下一節所述。
public partial class Hotel
{
. . .
[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
public string Description { get; set; }
[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
[JsonPropertyName("Description_fr")]
public string DescriptionFr { get; set; }
[SearchableField(AnalyzerName = "url-analyze")]
public string Url { get; set; }
. . .
}
定義自訂分析器
需要自訂或設定時,請將分析器建構新增至索引。 一旦您定義了分析器,就可以將其新增至欄位定義,如上一個範例所示。
建立 CustomAnalyzer 物件。 自訂分析器是已知權杖化工具、零或多個權杖篩選條件,以及零或多個字元篩選條件名稱的使用者定義組合:
下列範例會建立名為 "url-analyze" 的自訂分析器,其會使用 uax_url_email 權杖化工具和小寫權杖篩選條件。
private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));
var analyzer = new CustomAnalyzer("url-analyze", "uax_url_email")
{
TokenFilters = { TokenFilterName.Lowercase }
};
var definition = new SearchIndex(indexName, searchFields);
definition.Analyzers.Add(analyzer);
adminClient.CreateOrUpdateIndex(definition);
}
下一步
您可以在 Azure AI 搜尋服務的全文檢索搜尋中找到查詢執行的詳細描述。 本文使用範例來說明表面上看似違反直覺的行為。
若要深入了解分析器,請參閱下列文章: