Eliminare e ricompilare un indice in Ricerca di intelligenza artificiale di Azure

Questo articolo illustra come eliminare e ricompilare un indice di Ricerca di intelligenza artificiale di Azure. Vengono illustrate le circostanze in cui sono necessarie le ricompilazione e vengono fornite raccomandazioni per attenuare gli effetti delle ricompilazione sulle richieste di query in corso. Se è necessario ricompilare frequentemente, è consigliabile usare alias di indice per semplificare lo scambio dell'indice a cui punta l'applicazione.

Durante lo sviluppo attivo, è comune eliminare e ricompilare gli indici quando si esegue l'iterazione sulla progettazione degli indici. La maggior parte degli sviluppatori lavora con un piccolo campione rappresentativo dei dati in modo che la reindicizzazione diventi più veloce.

Modifiche che richiedono una ricompilazione

Nella tabella seguente sono elencate le modifiche che richiedono un'eliminazione e la ricompilazione dell'indice.

Azione Descrizione
Eliminare un campo Per rimuovere fisicamente tutte le tracce di un campo è necessario ricompilare l'indice. Quando una ricompilazione immediata non è pratica, è possibile modificare il codice dell'applicazione per reindirizzare l'accesso da un campo obsoleto o usare i campi searchFields e selezionare i parametri di query per scegliere quali campi vengono cercati e restituiti. Fisicamente la definizione del campo e i contenuti rimangono nell'indice fino alla successiva ricompilazione, quando si applica uno schema che omette il campo in questione.
Modificare la definizione di un campo Le revisioni di un nome di campo, un tipo di dati o attributi di indice specifici (ricercabile, filtrabile, ordinabile, facetable) richiedono una ricompilazione completa.
Assegnare un analizzatore a un campo Gli analizzatori vengono definiti in un indice, assegnati ai campi e quindi richiamati durante l'indicizzazione per informare come vengono creati i token. È possibile aggiungere una nuova definizione di analizzatore a un indice in qualsiasi momento, ma è possibile assegnare un analizzatore solo quando il campo viene creato. Questo vale per entrambe le proprietà analyzer e indexAnalyzer. La proprietà searchAnalyzer è un'eccezione perché è possibile assegnare questa proprietà a un campo esistente.
Aggiornare o eliminare una definizione di analizzatore in un indice Non è possibile eliminare o modificare una configurazione dell'analizzatore esistente (analizzatore, tokenizer, filtro token o filtro char) nell'indice a meno che non si ricompila l'intero indice.
Aggiungere un campo a uno strumento suggerimenti Se esiste già un campo e si vuole aggiungerlo a un costrutto Suggesters , ricompilare l'indice.
Cambiare i livelli Gli aggiornamenti sul posto non sono supportati. Se è necessaria una maggiore capacità, creare un nuovo servizio e ricompilare gli indici da zero. Per automatizzare questo processo, è possibile usare il codice di esempio index-backup-restore in questo repository di esempio di Ricerca di intelligenza artificiale di Azure .NET. Questa app eseguirà il backup dell'indice in una serie di file JSON e quindi ricrea l'indice in un servizio di ricerca specificato.

Modifiche senza requisiti di ricompilazione

Molte altre modifiche possono essere apportate senza influire sulle strutture fisiche esistenti. In particolare, le modifiche seguenti non richiedono una ricompilazione dell'indice. Per queste modifiche, è possibile aggiornare una definizione di indice esistente con le modifiche apportate.

  • Aggiungi un nuovo campo
  • Impostare l'attributo retrievable su un campo esistente
  • Aggiornare searchAnalyzer in un campo con un indice esistenteAnalyzer
  • Aggiungere una nuova definizione dell'analizzatore in un indice (che può essere applicato ai nuovi campi)
  • Aggiungere, aggiornare o eliminare i profili di punteggio
  • Aggiungere, aggiornare o eliminare le impostazioni di CORS
  • Aggiungere, aggiornare o eliminare synonymMaps
  • Aggiungere, aggiornare o eliminare configurazioni semantiche

Quando si aggiunge un nuovo campo, ai documenti indicizzati esistenti viene assegnato un valore Null per il nuovo campo. In un aggiornamento dei dati futuro, i valori dei dati di origine esterna sostituiscono i valori Null aggiunti da Ricerca di intelligenza artificiale di Azure. Per altre informazioni sull'aggiornamento del contenuto degli indici, vedere Add, Update or Delete Documents (Aggiungere, aggiornare o eliminare documenti).

Come ricompilare un indice

Durante lo sviluppo, lo schema dell'indice cambia frequentemente. È possibile pianificarla creando indici che possono essere eliminati, ricreati e ricaricati rapidamente con un set di dati rappresentativo di piccole dimensioni.

Per le applicazioni già in produzione è consigliabile creare un nuovo indice da eseguire affiancato a un indice esistente per evitare tempi di inattività delle query. Il codice dell'applicazione fornisce il reindirizzamento al nuovo indice.

  1. Verificare la presenza di spazio. servizio di ricerca sono soggetti al numero massimo di indici, variabili in base al livello di servizio. Assicurarsi di disporre di spazio per un secondo indice.

  2. Determinare se è necessaria una ricompilazione. Se si aggiungono solo campi o si modifica una parte dell'indice non correlato ai campi, è possibile aggiornare semplicemente la definizione senza eliminare, ricreare e ricaricarla completamente.

  3. Ottenere una definizione di indice nel caso in cui sia necessario per riferimento futuro.

  4. Eliminare l'indice esistente, presupponendo che non si eseguano indici nuovi e precedenti affiancati.

    Le eventuali query destinate a tale indice vengono eliminate immediatamente. Tenere presente che l'eliminazione di un indice è irreversibile, eliminando l'archiviazione fisica per la raccolta di campi e altri costrutti. Sospendere la riflessione sulle implicazioni prima di eliminarla.

  5. Creare un indice rivisto, in cui il corpo della richiesta include definizioni di campo modificate o modificate.

  6. Caricare l'indice con i documenti da un'origine esterna.

Quando si crea l'indice, viene allocato uno spazio di archiviazione fisico per ogni campo dello schema di indice e viene creato un indice invertito per ogni campo ricercabile. I campi che non sono ricercabili possono essere usati nei filtri o nelle espressioni, ma non hanno indici invertiti e non sono ricercabili full-text o fuzzy. Durante una ricompilazione dell'indice, questi indici invertiti vengono eliminati e ricreati in base allo schema di indice fornito.

Quando si carica l'indice, l'indice invertito di ogni campo viene popolato con tutte le parole univoche e tokenizzate di ogni documento, con un mapping agli ID documento corrispondenti. Ad esempio, nel caso dell'indicizzazione di un set di dati di hotel, un indice invertito creato per un campo Città potrebbe contenere termini per Roma, Milano e così via. Per i documenti che includono Roma o Milano nel campo Città, il relativo ID documento viene elencato insieme al termine. Durante un'operazione di aggiunta, aggiornamento o eliminazione, l'elenco dei termini e degli ID documento viene aggiornato di conseguenza.

Bilanciamento dei carichi di lavoro

L'indicizzazione non viene eseguita in background, ma il servizio di ricerca bilancia tutti i processi di indicizzazione rispetto alle query in corso. Durante l'indicizzazione, è possibile monitorare le richieste di query nel portale per assicurarsi che le query vengano completate in modo tempestivo.

Se l'indicizzazione dei carichi di lavoro introduce livelli inaccettabili di latenza delle query, eseguire l'analisi delle prestazioni ed esaminare questi suggerimenti sulle prestazioni per una potenziale mitigazione.

Verifica della presenza di aggiornamenti

È possibile iniziare a eseguire query su un indice subito dopo il caricamento del primo documento. Se si conosce l'ID di un documento, l'API REST di ricerca documenti restituisce il documento specifico. Per un test su più larga scala, è possibile aspettare che l'indice venga caricato completamente e quindi usare le query per verificare il contesto che ci si aspetta di vedere.

È possibile usare Esplora ricerche o un client REST per verificare la disponibilità di contenuto aggiornato.

Se è stato aggiunto o rinominato un campo, utilizzare $select per restituire tale campo: search=*&$select=document-id,my-new-field,some-old-field&$count=true

Vedi anche