Indici di ricerca full-text nelle tabelle gestite di Unity Catalog

Importante

Questa funzionalità è in versione beta. Per utilizzarlo, un amministratore di workspace deve attivare SQL: Full-Text Search Index per le tabelle gestite di Unity Catalog dalla pagina Anteprime . Vedere Gestire le anteprime di Azure Databricks.

Trovare righe che contengono una parola o sottostringa specifica, come un codice di errore nei messaggi di log, può richiedere la scansione di grandi quantità di testo. Un indice di ricerca full-text accelera le ricerche in una o più colonne di testo di una tabella Delta Lake o Iceberg gestita. L'indice supporta la ricerca per sottostringa e la ricerca di parole. Quando interroghi la tabella con le funzioni search o isearch, Azure Databricks usa l'indice per saltare file che non possono contenere righe corrispondenti. Ciò riduce significativamente la quantità di dati analizzati, soprattutto per ricerche selettive.

Importante

Gli indici creati durante la versione beta non sono necessariamente compatibili con le versioni successive. Quando la funzionalità raggiunge l'anteprima pubblica, è necessario eliminare gli indici esistenti e crearne di nuovi.

Quando utilizzare gli indici di ricerca full-text

Crea un indice di ricerca a testo completo quando:

  • Cerchi regolarmente una o più colonne di testo di una grande tabella gestita per parole o sottostringhe.
  • Il pattern di ricerca appare in una piccola frazione dei file della tabella. Gli indici accelerano maggiormente queste ricerche selettive.
  • Puoi scrivere le query usando le funzioni search o isearch. Consulta dati usando search e isearch.

Non creare un indice su una tabella che utilizza una funzionalità elencata nelle Limitazioni, come la sicurezza a livello di riga o le maschere di colonna. Azure Databricks ignora l'indice su quelle tabelle.

Requirements

Gli indici di ricerca full-text richiedono risorse di calcolo, autorizzazioni sulla tabella di base e sullo schema e una configurazione della tabella di base adeguata.

Compute

Gli indici di ricerca a testo completo sono disponibili solo in Databricks Runtime 18.2 e versioni successive, e devi abilitare questa funzione Beta nelle impostazioni del tuo workspace. Vedere Gestire le anteprime di Azure Databricks.

Permissions

Per creare un indice di ricerca:

  • È necessario disporre dell'autorizzazione MODIFY per la tabella a cui si fa riferimento nell'indice di ricerca.
  • È necessario disporre dell'autorizzazione CREATE TABLE per lo schema padre. Un proprietario dello schema o un utente con il privilegio MANAGE può concederti privilegi CREATE TABLE sullo schema.

Configurazione delle tabelle

Prima di creare un indice di ricerca a testo intero, la tabella base deve soddisfare tutti questi requisiti:

  • È necessario creare l'indice nello stesso catalogo e nello stesso schema della tabella di base.
  • La tabella è una tabella Delta Lake gestita o una tabella Iceberg gestita.
  • Il rilevamento delle righe è abilitato (delta.enableRowTracking = true). Vedi Tracciamento delle righe in Azure Databricks.
  • Le colonne indicizzate sono di tipo STRING, VARIANT, STRUCTo ARRAY. STRING colonne usano la regola di confronto UTF8_BINARY.
  • Una colonna STRUCT contiene almeno un campo foglia STRING, VARIANT o ARRAY a qualsiasi livello di annidamento; gli altri campi foglia vengono ignorati.
  • La tabella non usa funzionalità dell'elenco delle limitazioni, tra cui: OpenSharing, clonazione superficiale, controlli di accesso basati su attributi, criteri di sicurezza a livello di riga e maschere di colonna. Vedere Limitazioni.

Per informazioni sui requisiti del protocollo di tabella, che si applicano alle tabelle Delta Lake e Iceberg, vedere Compatibilità e protocolli delle funzionalità delta Lake.

Crea un indice di ricerca a testo completo

È possibile creare fino a quattro indici in una singola tabella, ognuno in una colonna diversa.

Usare CREATE SEARCH INDEX per creare un indice su una o più colonne di testo. Nell'esempio seguente vengono indicizzate due colonne di testo di una tabella di log esistente:

CREATE SEARCH INDEX log_idx
ON logs (message, error_detail);

La sintassi completa è:

CREATE SEARCH INDEX [IF NOT EXISTS] index_name
  ON table_name ( column_name [, column_name ...] )
  [OPTIONS ( option_key = option_value [, ... ] )]

index_name deve essere univoco all'interno dello schema e non può corrispondere a un nome di tabella esistente.

Per controllare la modalità di tokenizzazione del testo, vedere Opzioni.

Avvertimento

Se CREATE SEARCH INDEX e REFRESH INDEX hanno esito negativo durante l'esecuzione, eseguire REFRESH INDEX per eseguire il ripristino da un errore parziale.

Opzioni

La OPTIONS clausola accetta queste chiavi:

Chiave Valori Predefinito Description
tokenizer ngram, split ngram Modalità di tokenizzazione del testo per l'indicizzazione. Consulta Seleziona un tokenizer in base al tuo caso d'uso.
ngram_size intero in [3, 10] 5 Lunghezza degli n-grammi generati. Valido solo quando tokenizer = 'ngram'.
min_token_length Intero >= 1 3 Lunghezza minima dei token da mantenere. I token più brevi di questo vengono eliminati durante l'indicizzazione. Valido solo quando tokenizer = 'split'.

Per informazioni dettagliate sugli errori di opzione non validi, vedere la condizione di errore SEARCH_INDEX_INVALID_PARAMETERS.

Seleziona un tokenizer per il tuo caso d'uso

Gli indici di ricerca hanno 2 opzioni di tokenizer disponibili, a seconda del caso d'uso:

Tokenizzatore Caso di utilizzo Description
ngram Confronto di sottostringhe. Suddivide il testo in n-grammi sovrapposti di lunghezza ngram_size.
split Controlli di contenimento di parole intere. Suddivide il testo in token di parola. Un token è un'esecuzione di lettere Unicode () e segni di combinazione (\p{L}\p{M}); qualsiasi altro carattere è un delimitatore.

Per creare un indice n-gram con una dimensione n-gram di 4:

CREATE SEARCH INDEX log_ngram_idx
  ON logs (message)
  OPTIONS (tokenizer = 'ngram', ngram_size = 4);

Per creare un split indice con una lunghezza minima di token pari a 2:

CREATE SEARCH INDEX log_word_idx
  ON logs (message)
  OPTIONS (tokenizer = 'split', min_token_length = 2);

Interrogare i dati usando search e isearch

Azure Databricks dispone di due funzioni SQL per verificare se un criterio di ricerca è presente in una o più destinazioni di testo:

  • search: Distinzione tra maiuscole e minuscole.
  • isearch: senza distinzione tra maiuscole e minuscole.

Seleziona search o isearch in base al requisito di distinzione tra maiuscole e minuscole. Quando le colonne indicizzate sono coperte da un indice di ricerca full-text, Azure Databricks utilizza l'indice per saltare i file che sicuramente non contengono righe corrispondenti. Gli indici di ricerca non influiscono sui risultati.

Gli indici accelerano la maggior parte delle query quando il criterio di ricerca viene visualizzato in una piccola frazione dei file della tabella.

search( target [, target ... ] , 'pattern' [, mode => 'substring' | 'word' ] )
isearch( target [, target ... ] , 'pattern' [, mode => 'substring' | 'word' ] )

Arguments

search e isearch accettano questi argomenti:

  • targetdeve essere di tipo STRING, VARIANTSTRUCT, o ARRAY, gli stessi tipi consentiti dall'indicizzazione. Le destinazioni vengono deduplicate.
  • pattern deve essere una stringa letterale non nulla.
  • mode specifica come pattern corrisponde a ogni target:
    • substring (impostazione predefinita): pattern viene trovato come sottostringa all'interno di ogni target.
    • word: pattern è suddiviso in token di parola usando la stessa regola del split tokenizer. La funzione restituisce true se ogni parola in pattern viene visualizzata in almeno una destinazione, indipendentemente dall'ordine. Consulta Seleziona un tokenizer in base al tuo caso d'uso.

Returns

search e isearch restituiscono un BOOLEAN valore con logica a tre valori:

  • true se almeno una destinazione non Null corrisponde.
  • null se nessun target non null corrisponde, ma almeno un target è null.
  • false se tutte le destinazioni sono non nulle e nessuna coincide.

Examples

Questi esempi mostrano le query comuni search e isearch:

-- Case-insensitive substring search across one column.
SELECT * FROM logs
WHERE isearch(message, 'connection refused');

-- Case-sensitive substring search across multiple columns.
SELECT * FROM logs
WHERE search(message, error_detail, '550e8400-e29b-41d4-a716-446655440000');

-- Word search: matches rows containing all three words, in any order.
SELECT * FROM audit_logs
WHERE search(message, 'user admin login', mode => 'word');

Gestire gli indici

Importante

Gli indici di ricerca full-text non vengono aggiornati automaticamente quando cambia la tabella di base. Vedere Aggiornare un indice.

Azure Databricks mantiene la correttezza delle query, indipendentemente dall'aggiornamento dell'indice. Quando una tabella contiene dati non indicizzati, la query usa l'indice esistente per accelerare l'accesso ai record indicizzati e usa un'analisi di tabella per i record non indicizzati.

Usa queste operazioni per gestire gli indici di ricerca a testo completo:

Descrivere o visualizzare un indice

Per visualizzare informazioni su un indice:

DESCRIBE INDEX log_idx;

Aggiornare un indice

Gli indici di ricerca full-text non vengono aggiornati automaticamente quando cambia la tabella di base.

Per aggiornare l'indice, aggiungere voci per le nuove righe:

REFRESH INDEX log_idx;

REFRESH INDEX è un'operazione incrementale di sola aggiunta. Indicizza i nuovi dati, ma non rimuove le voci relative alle righe cancellate.

Per aggiornare l'indice, sia aggiungendo voci relative alle nuove righe sia rimuovendo voci relative alle righe eliminate, utilizzare REFRESH INDEX ... FULL:

REFRESH INDEX log_idx FULL;

Un aggiornamento completo richiede più risorse di calcolo rispetto a un aggiornamento incrementale. Nel corso del tempo, gli aggiornamenti incrementali accumulano voci non aggiornate, che aumentano le dimensioni dell'indice e influiscono negativamente sulle prestazioni.

Eliminare un indice

Per eliminare un indice, esegui:

DROP INDEX log_idx;

Per evitare un errore per gli indici mancanti, usare:

DROP INDEX IF EXISTS log_idx;

Annotazioni

Se si elimina la tabella di base, il comando elimina anche gli indici di ricerca full-text.

Limitazioni

Gli indici di ricerca a testo integrale presentano queste limitazioni:

  • La ridenominazione di una colonna indicizzata nella tabella di base o la modifica del tipo di dati non è supportata.
  • Le tabelle con OpenSharing non sono supportate. Se si aggiunge la tabella di base come origine o destinazione OpenSharing dopo la creazione dell'indice, Azure Databricks ignora l'indice di ricerca.
  • Le tabelle con cloni superficiali non sono supportate. Se si aggiunge la tabella di base come origine clone superficiale dopo la creazione dell'indice, Azure Databricks ignora l'indice di ricerca.
  • Le tabelle con controlli di accesso basato su attributi, maschere di colonna o criteri di sicurezza a livello di riga non sono supportate. Se si aggiunge uno di questi controlli a una tabella con un indice di ricerca, Azure Databricks ignora l'indice di ricerca. Vedere Concetti di base per il controllo degli accessi in base agli attributi.See Core concepts for attribute-based access control (ABAC).