Analizzatori per l'elaborazione del testo in Ricerca di intelligenza artificiale di Azure

Un analizzatore è un componente del motore di ricerca full-text responsabile dell'elaborazione delle stringhe durante l'indicizzazione e l'esecuzione di query. L'elaborazione del testo (nota anche come analisi lessicale) è trasformativa, modificando una stringa tramite azioni come queste:

  • Rimuovere parole non essenziali (parole non essenziali) e punteggiatura
  • Suddividere frasi e parole sillabate in parti componenti
  • Lettere minuscole qualsiasi parola maiuscola
  • Ridurre le parole in forme radice primitive per l'efficienza di archiviazione e in modo che le corrispondenze possano essere trovate indipendentemente dal tempo teso

L'analisi si applica ai Edm.String campi contrassegnati come "ricercabili", che indica la ricerca full-text.

Per i campi di questa configurazione, l'analisi viene eseguita durante l'indicizzazione quando vengono creati i token e quindi di nuovo durante l'esecuzione delle query quando vengono analizzate le query e il motore analizza i token corrispondenti. È più probabile che si verifichi una corrispondenza quando lo stesso analizzatore viene usato sia per l'indicizzazione che per le query, ma è possibile impostare l'analizzatore per ogni carico di lavoro in modo indipendente, a seconda dei requisiti.

I tipi di query che non sono ricerca full-text, ad esempio filtri o ricerca fuzzy, non passano attraverso la fase di analisi sul lato query. Il parser invia invece tali stringhe direttamente al motore di ricerca, usando il modello fornito come base per la corrispondenza. In genere, questi moduli di query richiedono token di stringa intera per far funzionare i criteri di ricerca. Per garantire che i token completi vengano mantenuti durante l'indicizzazione, potrebbero essere necessari analizzatori personalizzati. Per altre informazioni su quando e perché vengono analizzati i termini di query, vedere Ricerca full-text in Ricerca di intelligenza artificiale di Azure.

Per altre informazioni sull'analisi lessicale, ascolta il video clip seguente per una breve spiegazione.

Analizzatore predefinito

In Ricerca di intelligenza artificiale di Azure un analizzatore viene richiamato automaticamente in tutti i campi stringa contrassegnati come ricercabili.

Per impostazione predefinita, Ricerca di intelligenza artificiale di Azure usa l'analizzatore Apache Lucene Standard (lucene standard), che suddivide il testo in elementi che seguono le regole di segmentazione del testo Unicode. L'analizzatore standard converte tutti i caratteri nel formato minuscolo. I documenti indicizzati e i termini di ricerca vengono sottoposti ad analisi durante l'indicizzazione e l'elaborazione delle query.

È possibile eseguire l'override del valore predefinito nei singoli campi. Gli analizzatori alternativi possono essere un analizzatore del linguaggio per l'elaborazione linguistica, un analizzatore personalizzato o un analizzatore predefinito dall'elenco degli analizzatori disponibili.

Tipi di analizzatori

L'elenco seguente descrive gli analizzatori disponibili in Ricerca di intelligenza artificiale di Azure.

Categoria Descrizione
Analizzatore Lucene standard Predefinito. Non è necessaria alcun specifica o configurazione. Questo analizzatore per utilizzo generico offre prestazioni elevate per molti linguaggi e scenari.
Analizzatori predefiniti Utilizzato così come è e a cui viene fatto riferimento in base al nome. Esistono due tipi: lingua e lingua indipendente. Gli

analizzatori specializzati (indipendenti dal linguaggio) vengono usati quando gli input di testo richiedono un'elaborazione minima o specializzata. Esempi di analizzatori in questa categoria includono Asciifolding, Keyword, Pattern, Simple, Stop, Whitespace. Gli

analizzatori del linguaggio vengono usati quando è necessario un supporto linguistico avanzato per i singoli linguaggi. Ricerca di intelligenza artificiale di Azure supporta 35 analizzatori del linguaggio Lucene e 50 analizzatori di elaborazione del linguaggio naturale Microsoft.
Analizzatori personalizzati Si riferisce a una configurazione definita dall'utente di una combinazione di elementi esistenti, costituiti da un tokenizer (obbligatorio) e da filtri facoltativi (char o token).

Alcuni analizzatori predefiniti, ad esempio Pattern o Stop, supportano un set limitato di opzioni di configurazione. Per impostare queste opzioni, creare un analizzatore personalizzato, costituito dall'analizzatore predefinito e da una delle opzioni alternative documentate in Analizzatori predefiniti. Come per qualsiasi configurazione personalizzata, attribuire un nome alla nuova configurazione, ad esempio myPatternAnalyzer, per distinguerla dall'analizzatore Pattern Lucene.

Specifica di analizzatori

L'impostazione di un analizzatore è facoltativa. Come regola generale, provare prima a usare l'analizzatore Lucene standard predefinito per verificare le prestazioni. Se le query non restituiscono i risultati previsti, il passaggio a un analizzatore diverso è spesso la soluzione corretta.

  1. Se si usa un analizzatore personalizzato, aggiungerlo all'indice di ricerca nella sezione "analizzatore". Per altre informazioni, vedere Creare un indice e Aggiungere analizzatori personalizzati.

  2. Quando si definisce un campo, impostare la proprietà "analyzer" su una delle opzioni seguenti: un analizzatore predefinito, ad esempio una parola chiave, un analizzatore del linguaggio, en.microsoftad esempio o un analizzatore personalizzato (definito nello stesso schema di indice).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Se si usa un analizzatore del linguaggio, è necessario usare la proprietà "analyzer" per specificarla. Le proprietà "searchAnalyzer" e "indexAnalyzer" non si applicano agli analizzatori del linguaggio.

  4. In alternativa, impostare "indexAnalyzer" e "searchAnalyzer" per variare l'analizzatore per ogni carico di lavoro. Queste proprietà funzionano insieme come sostituto della proprietà "analizzatore", che deve essere null. È possibile usare analizzatori diversi per l'indicizzazione e le query se una di queste attività richiede una trasformazione specifica non necessaria per l'altro.

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

Quando aggiungere analizzatori

Il momento migliore per aggiungere e assegnare gli analizzatori è durante lo sviluppo attivo, quando eliminare e ricreare gli indici è routine.

Poiché gli analizzatori vengono usati per tokenizzare i termini, è necessario assegnare un analizzatore al momento della creazione del campo. Infatti, l'assegnazione di un analizzatore o di un indexAnalyzer a un campo già creato fisicamente non è consentita (anche se è possibile modificare la proprietà searchAnalyzer in qualsiasi momento senza alcun impatto sull'indice).

Per modificare l'analizzatore di un campo esistente, è necessario eliminare e ricreare l'intero indice (non è possibile ricompilare singoli campi). Per gli indici nell'ambiente di produzione, è possibile rinviare una ricompilazione creando un nuovo campo con la nuova assegnazione dell'analizzatore e iniziare a usarlo al posto di quello precedente. Usare Aggiornare un indice per incorporare il nuovo campo e mergeOrUpload per compilarlo. In un secondo momento, nell'ambito della manutenzione pianificata dell'indice, sarà possibile pulire l'indice per rimuovere i campi obsoleti.

Per aggiungere un nuovo campo a un indice esistente, chiamare Aggiorna indice per aggiungere il campo e mergeOrUpload per popolarlo.

Per aggiungere un analizzatore personalizzato a un indice esistente, passare il flag "allowIndexDowntime" in Update Index se si vuole evitare questo errore:

"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."

Consigli per l'utilizzo degli analizzatori

Questa sezione offre consigli su come usare gli analizzatori.

Usare un unico analizzatore in lettura-scrittura, a meno che non si disponga di requisiti specifici

Ricerca di intelligenza artificiale di Azure consente di specificare analizzatori diversi per l'indicizzazione e la ricerca tramite le proprietà del campo "indexAnalyzer" e "searchAnalyzer". Se non è specificato, l'analizzatore impostato con la proprietà analizzatore viene usato per l'indicizzazione e la ricerca. Se l'analizzatore non è specificato, viene usato l'analizzatore Lucene Standard predefinito.

Una regola generale consiste nell'usare lo stesso analizzatore sia per l'indicizzazione che per l'esecuzione di query, salvo diversamente indicato da requisiti specifici. Assicurarsi di eseguire test approfonditi. Quando l'elaborazione del testo è diversa in fase di ricerca e indicizzazione, si corre il rischio di mancata corrispondenza tra termini di query e termini indicizzati quando le configurazioni dell'analizzatore di ricerca e indicizzazione non sono allineate.

Test durante lo sviluppo attivo

L'override dell'analizzatore standard richiede una ricompilazione dell'indice. Se possibile, stabilire quali analizzatori usare durante la fase di sviluppo attivo, prima di passare un indice nell'ambiente di produzione.

Controllare i termini in formato token

Se la ricerca non restituisce i risultati previsti, è molto probabile che esistano discrepanze a livello di token tra i termini di input nella query e i termini in formato token nell'indice. Se il token non corrispondono, non vengono individuate corrispondenze. Per esaminare l'output del tokenizer, è consigliabile usare l'API di analisi come strumento di indagine. La risposta è costituita da token, generati da un analizzatore specifico.

Esempi REST

Gli esempi seguenti mostrano le definizioni degli analizzatori per alcuni scenari chiave.

Esempio di analizzatore personalizzato

Questo esempio illustra una definizione di analizzatore con opzioni personalizzate. Le opzioni personalizzate per filtri char, tokenizer e filtri token vengono specificate separatamente come costrutti denominati a cui si fa riferimento nella definizione dell'analizzatore. Gli elementi predefiniti vengono usati così come sono e a cui viene fatto riferimento in base al nome.

Passaggi di questo esempio:

  • Gli analizzatori sono una proprietà della classe di campo per un campo ricercabile.

  • Un analizzatore personalizzato fa parte della definizione di un indice. Esso può essere parzialmente personalizzato (ad esempio, tramite la personalizzazione di una singola opzione in un filtro) o personalizzato in più posizioni.

  • In questo caso, l'analizzatore personalizzato è "my_analyzer", che a sua volta usa il tokenizer standard personalizzato "my_standard_tokenizer" e due filtri token: un filtro asciifolding minuscolo e uno personalizzato "my_asciifolding".

  • Definisce inoltre due filtri di caratteri personalizzati: "map_dash" e "remove_whitespace". Il primo sostituisce tutti i trattini con caratteri di sottolineatura, mentre il secondo rimuove tutti gli spazi. Nelle regole di mapping gli spazi devono essere codificati con UTF-8. I filtri di caratteri vengono applicati prima della tokenizzazione e influiranno sui token risultanti (le interruzioni standard dei tokenizer sui trattini e gli spazi, ma non sui caratteri di sottolineatura).

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

Esempio di assegnazione dell'analizzatore in base al campo

L'analizzatore Standard è l'impostazione predefinita. Si supponga di volere sostituire l'elemento predefinito con un analizzatore predefinito diverso, ad esempio l'analizzatore Pattern. Se non si impostano opzioni personalizzate, è sufficiente specificarlo in base al nome nella definizione del campo.

L'elemento "analizzatore" sostituisce l'analizzatore Standard campo per campo. Non vi è alcun override globale. In questo esempio, text1 usa l'analizzatore Pattern, mentre text2, che non specifica un analizzatore, usa l'elemento predefinito.

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

Combinazioni di analizzatori per le operazioni di indicizzazione e ricerca

Le API includono attributi di indice per specificare analizzatori diversi per l'indicizzazione e la ricerca. Gli attributi searchAnalyzer e indexAnalyzer devono essere specificati come coppia, sostituendo il singolo attributo analizzatore.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
     ],
  }

Esempio di analizzatore del linguaggio

I campi contenenti stringhe in diverse lingue possono utsare un analizzatore del linguaggio, mentre altri campi mantengono il valore predefinito (o usano altri analizzatori predefiniti o personalizzati). Se si usa un analizzatore del linguaggio, questo deve essere usato per le operazioni di indicizzazione e ricerca. I campi che usano un analizzatore del linguaggio non possono avere analizzatori diversi per l'indicizzazione e la ricerca.

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

Esempi di C#

Se si usano gli esempi di codice .NET SDK, è possibile aggiungere questi esempi per usare o configurare gli analizzatori.

Assegnare un analizzatore del linguaggio

Qualsiasi analizzatore usato così come è, senza alcuna configurazione, viene specificato in una definizione di campo. Non è necessario creare una voce nella sezione [analizzatori] dell'indice.

Gli analizzatori di lingua vengono usati così come sono. Per usarle, chiamare LexicalAnalyzer, specificando il tipo LexicalAnalyzerName che fornisce un analizzatore di testo supportato in Ricerca di intelligenza artificiale di Azure.

Gli analizzatori personalizzati vengono specificati in modo analogo nella definizione del campo, ma per questo motivo è necessario specificare l'analizzatore nella definizione dell'indice, come descritto nella sezione successiva.

    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; }
      . . .
    }

Definire un analizzatore personalizzato

Quando è necessaria la personalizzazione o la configurazione, aggiungere un costrutto analizzatore a un indice. Dopo averla definita, è possibile aggiungerla alla definizione del campo, come illustrato nell'esempio precedente.

Creare un oggetto CustomAnalyzer . Un analizzatore personalizzato è una combinazione definita dall'utente di un tokenizer noto, zero o più filtri token e zero o più nomi di filtro di caratteri:

L'esempio seguente crea un analizzatore personalizzato denominato "url-analyze" che usa il tokenizer uax_url_email e il filtro token minuscolo.

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);
}

Passaggi successivi

Una descrizione dettagliata dell'esecuzione delle query è disponibile nella ricerca full-text in Ricerca di intelligenza artificiale di Azure. L'articolo usa esempi per spiegare i comportamenti che potrebbero sembrare poco intuitivi sulla superficie.

Per altre informazioni sugli analizzatori, vedere gli articoli seguenti: