Azure AI 搜尋服務中的文字處理分析器

分析器是全文搜尋引擎元件,負責在編製索引和查詢執行期間處理字串。 文字處理(也稱為語彙分析)具有轉換性,可透過下列動作修改字串:

  • 拿掉非基本字詞 (停用字詞) 和標點符號
  • 將片語和連字元字分割成元件元件
  • 小寫任何大寫單字
  • 將單字減少為基本根窗體以提升儲存效率,以便找到相符專案,而不論緊張

分析適用於 Edm.String 標示為「可搜尋」的欄位,表示全文搜索。

針對此組態的欄位,分析會在建立令牌時進行編製索引,然後在剖析查詢時再次在查詢執行期間進行分析,而引擎會掃描是否有相符的令牌。 當相同的分析器用於編製索引和查詢時,比較可能發生比對,但您可以根據需求,個別設定每個工作負載的分析器。

不是全文搜索的查詢類型,例如篩選或模糊搜尋,不會經歷查詢端的分析階段。 相反地,剖析器會使用您提供作為比對基礎的模式,將這些字串直接傳送至搜尋引擎。 一般而言,這些查詢表單需要全字串標記,才能讓模式比對工作。 為了確保在編製索引期間保留整個字詞令牌,您可能需要 自定義分析器。 如需何時和為何分析查詢字詞的詳細資訊,請參閱 Azure AI 搜尋中的全文搜索

如需語彙分析的更多背景,請接聽下列影片剪輯以取得簡短的說明。

預設分析器

在 Azure AI 搜尋中,分析器會自動在標示為可搜尋的所有字串欄位中叫用。

根據預設,Azure AI 搜尋會使用 Apache Lucene Standard 分析器(標準 lucene),其會將文字細分為遵循「Unicode 文字分割」規則的元素。 標準分析器會將所有字元轉換成其小寫形式。 索引檔和搜尋字詞都會在編製索引和查詢處理期間進行分析。

您可以逐欄位覆寫預設值。 替代分析器可以是語言處理自定義分析器,或可用分析器清單中的內建分析器

分析器類型

下列清單描述 Azure AI 搜尋服務中有哪些分析器可供使用。

類別 描述
標準 Lucene 分析器 預設。 不需要任何規格或設定。 此一般用途分析器適用於許多語言和案例。
內建分析器 依目前方式取用,並依名稱參考。 有兩種類型:語言和語言無關。

當文字輸入需要特製化處理或最少處理時,會使用特製化(語言無關)分析器 。 此類別中的分析器範例包括 Asciifolding、KeywordPatternSimple、StopWhitespace

當您需要對個別語言提供豐富的語言支援時,會使用語言分析器 。 Azure AI 搜尋支援 35 個 Lucene 語言分析器和 50 個 Microsoft 自然語言處理分析器。
自定義分析器 是指現有元素組合的使用者定義組態,其中包含一個 Tokenizer(必要)和選擇性篩選條件(char 或 token)。

一些內建分析器,例如 模式停止,支援一組有限的組態選項。 若要設定這些選項,請建立自定義分析器,其中包含內建分析器和內建分析器記載的其中一個替代選項。 如同任何自定義組態,請提供新的組態名稱,例如 myPatternAnalyzer 來區別它與 Lucene Pattern 分析器。

指定分析器

設定分析器是選擇性的。 一般情況下,請先嘗試使用預設標準 Lucene 分析器來查看其執行方式。 如果查詢無法傳回預期的結果,切換至不同的分析器通常是正確的解決方案。

  1. 如果您使用自定義分析器,請將它新增至 「分析器」區段下的搜尋索引。 如需詳細資訊,請參閱 建立索引 ,以及 新增自定義分析器

  2. 定義欄位時,將它的 「analyzer」 屬性設定為下列其中一項:內建分析器,例如 關鍵詞例如 en.microsoft的語言分析器,或自定義分析器(定義在相同的索引架構中)。

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. 如果您使用 語言分析器,則必須使用 「analyzer」 屬性來指定它。 “searchAnalyzer” 和 “indexAnalyzer” 屬性不適用於語言分析器。

  4. 或者,設定 「indexAnalyzer」 和 「searchAnalyzer」 來變更每個工作負載的分析器。 這些屬性會一起運作,做為 “analyzer” 屬性的替代專案,必須是 Null。 如果其中一個活動需要另一個不需要的特定轉換,您可以使用不同的分析器來編製索引和查詢。

      "fields": [
     {
       "name": "ProductGroup",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "indexAnalyzer": "keyword",
       "searchAnalyzer": "standard"
     },
    

新增分析器的時機

新增和指派分析器的最佳時機是在作用中開發期間,卸除和重新建立索引是例行公事。

因為分析器是用來標記詞彙,因此您應該在建立字段時指派分析器。 事實上,不允許將分析器或 indexAnalyzer 指派給已實際建立的欄位(雖然您可以隨時變更 searchAnalyzer 屬性,但不會影響索引)。

若要變更現有欄位的分析器,您必須卸除並重新建立整個索引(您無法重建個別欄位)。 針對生產中的索引,您可以藉由使用新的分析器指派建立新的欄位來延遲重建,並開始使用它來取代舊的欄位。 使用 更新索引 來併入新的字段和 mergeOrUpload 來填入它。 稍後,在規劃的索引服務中,您可以清除索引以移除過時的字段。

若要將新欄位新增至現有的索引,請呼叫 Update Index 以新增欄位,並 合併OrUpload 以填入該欄位。

若要將自定義分析器新增至現有的索引,如果您想要避免此錯誤,請在更新索引傳遞 「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” 字段屬性進行搜尋。 如果未指定,則會使用分析器屬性設定分析器來編製索引和搜尋。 如果未指定分析器,則會使用預設的標準 Lucene 分析器。

一般規則是針對索引和查詢使用相同的分析器,除非另有規定特定需求。 請務必徹底測試。 當文字處理在搜尋和編製索引時間不同時,當搜尋和索引分析器設定未對齊時,您就會執行查詢字詞與索引字詞不相符的風險。

在主動開發期間進行測試

覆寫標準分析器需要重建索引。 如果可能的話,請在將索引滾動至生產環境之前,先決定要在使用中開發期間使用哪一個分析器。

檢查標記化字詞

如果搜尋無法傳回預期的結果,最可能的情況是查詢上字詞輸入與索引中的標記化字詞之間的差異。 如果令牌不相同,則相符項目無法具體化。 若要檢查 Tokenizer 輸出,建議您使用分析 API 作為調查工具。 回應是由特定分析器所產生的令牌所組成。

REST 範例

下列範例顯示幾個重要案例的分析器定義。

自定義分析器範例

此範例說明具有自定義選項的分析器定義。 char 篩選、令牌化程式和令牌篩選的自定義選項會分別指定為具名建構,然後在分析器定義中參考。 預先定義的元素會依預設使用,並依名稱參考。

逐步解說此範例:

  • 分析器是可搜尋欄位之欄位類別的屬性。

  • 自定義分析器是索引定義的一部分。 它可以輕量自定義(例如,在單一篩選中自定義單一選項),或在多個位置自定義。

  • 在此情況下,自定義分析器是“my_analyzer”,接著會使用自定義的標準令牌化程式“my_standard_tokenizer”和兩個令牌篩選器:小寫和自定義的 asciifolding 篩選 “my_asciifolding”。

  • 它也會定義 2 個自訂字元篩選器 「map_dash」 和 「remove_whitespace」。 第一個會以底線取代所有破折號,而第二個虛線則會移除所有空格。 空格必須在對應規則中編碼 UTF-8。 字元篩選會在令牌化之前套用,並會影響產生的令牌(標準 Tokenizer 會在破折號和空格上中斷,但不在底線上)。

  {
     "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
        }
     ]
  }

個別欄位分析器指派範例

標準分析器是預設值。 假設您想要以不同的預先定義分析器取代預設值,例如模式分析器。 如果您未設定自定義選項,則只需要在欄位定義中依名稱指定它。

“analyzer” 元素會逐字段覆寫標準分析器。 沒有全域覆寫。 在此範例中, 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 屬性必須指定為配對,以取代單一分析器屬性。

  {
     "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 物件。 自定義分析器是已知Tokenizer、零或多個令牌篩選,以及零或多個字元篩選名稱的使用者定義組合:

下列範例會建立名為 「url-analyze」 的自定義分析器,該分析器會使用 uax_url_email Tokenizer小寫令牌篩選器

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 搜尋的全文搜尋中找到查詢執行的詳細描述。 本文使用範例來說明表面上看似直覺的行為。

若要深入瞭解分析器,請參閱下列文章: