Eliminare e ricompilare un indice in Ricerca cognitiva di Azure

Questo articolo illustra come eliminare e ricompilare un indice Ricerca cognitiva di Azure, le circostanze in cui sono necessarie ricompilazione e raccomandazioni per mitigare l'impatto delle ricompilazione sulle richieste di query in corso. Se spesso è necessario ricompilare l'indice di ricerca, è consigliabile usare gli alias di indice per semplificare lo scambio dell'indice a cui punta l'applicazione.

Un indice di ricerca è una raccolta di cartelle fisiche e indici invertiti basati sul campo del contenuto, distribuiti in partizioni nel numero di partizioni allocati all'indice di ricerca. In Ricerca cognitiva di Azure non è possibile eliminare e ricreare singoli campi. Se si vuole ricompilare completamente un campo, è necessario eliminare tutte le risorse di archiviazione dei campi, ricreare in base a uno schema di indice esistente o modificato e quindi ripopolato con i dati inseriti nell'indice o estratti da origini esterne.

È comune eliminare e ricompilare gli indici durante lo sviluppo quando si esegue l'iterazione sulla progettazione dell'indice. La maggior parte degli sviluppatori lavora con un piccolo esempio rappresentativo dei propri dati per facilitare questo processo.

Condizioni di ricompilazione

La tabella seguente enumera le condizioni in cui è necessaria una ricompilazione.

Condizione Descrizione
Modificare la definizione di un campo La modifica di un nome di campo, di un tipo di dati o di attributi di indice specifici (searchable, filterable, sortable, facetable) richiede una ricompilazione completa.
Assegnare un analizzatore a un campo Gli analizzatori vengono definiti in un indice e quindi assegnati ai campi. È 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 di analizzatore esistente (analizzatore, tokenizer, filtro di token o filtro di caratteri) nell'indice a meno che non si ricompili l'intero indice.
Aggiungere un campo a uno strumento suggerimenti Se esiste già un campo e lo si vuole aggiungere a un costrutto Suggesters, è necessario ricompilare l'indice.
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 disabilitare l'accesso al campo "eliminato" o usare il parametro di query $select per scegliere quali campi sono rappresentati nel set di risultati. 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.
Cambiare i livelli Se è necessaria una maggiore capacità, non è disponibile alcun aggiornamento sul posto nella portale di Azure. È necessario creare un nuovo servizio e gli indici devono essere creati da zero nel nuovo servizio. Per automatizzare questo processo, è possibile usare il codice di esempio index-backup-restore in questo repository di esempio Ricerca cognitiva di Azure .NET. Questa app eseguirà il backup dell'indice in una serie di file JSON e quindi ricreare l'indice in un servizio di ricerca specificato.

Condizioni di aggiornamento

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 con le modifiche.

  • Aggiungere un nuovo campo
  • Impostare l'attributo recuperabile in un campo esistente
  • Aggiornare la ricercaAnalyzer in un campo con un indice esistenteAnalyzer
  • Aggiungere una nuova definizione di 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 futuri, i valori dei dati di origine esterna sostituiscono i valori Null aggiunti da Ricerca cognitiva 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 di indice cambia di frequente. È 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. 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.

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

  3. Eliminare l'indice esistente, presupponendo che non si eseguano indici nuovi e vecchi 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 il pensiero sulle implicazioni prima di eliminarlo.

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

  5. 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 non ricercabili possono essere usati in filtri o espressioni, ma non hanno indici invertiti e non supportano la ricerca 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 i carichi di lavoro di indicizzazione introducono livelli non accettabili di latenza delle query, eseguire l'analisi delle prestazioni e esaminare questi suggerimenti sulle prestazioni per la potenziale mitigazione.

Verificare gli 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 uno strumento di test Web, ad esempio Postman o Visual Studio Code per verificare la presenza di contenuto aggiornato.

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

Vedi anche