Sökindex i fulltext i hanterade unity-katalogtabeller

Viktigt!

Den här funktionen finns i Beta. Arbetsyteadministratörer kan styra åtkomsten till den här funktionen från sidan Förhandsversioner . Se Hantera förhandsversioner av Azure Databricks.

Ett fulltextsökningsindex påskyndar sökningar på en eller flera textkolumner i en hanterad Delta Lake- eller Iceberg-tabell. Indexet stöder delsträngsmatchning och ordmatchning. När du frågar tabellen med funktionerna search eller isearch använder Azure Databricks indexet för att hoppa över filer som garanterat inte innehåller matchande rader. Detta minskar avsevärt mängden data som genomsöks, särskilt för selektiva sökningar.

Viktigt!

Index som skapades under betaversionen är inte garanterade att vara kompatibla med senare versioner. När funktionen når den offentliga förhandsversionen måste du släppa befintliga index och skapa nya.

Requirements

Fulltextsökningsindex har krav för beräknings-, bastabell- och schemabehörigheter samt bastabellkonfiguration.

Compute

Fulltextsökningsindex är endast tillgängliga i Azure Databricks Runtime 18.2 och senare, och du måste aktivera den här Beta-funktionen i dina arbetsyteinställningar. Se Hantera förhandsversioner av Azure Databricks.

Permissions

Så här skapar du ett sökindex:

  • Du måste ha behörigheten MODIFY för tabellen som refereras till i sökindexet.
  • Du måste ha behörigheten CREATE TABLE för det överordnade schemat. En schemaägare eller användare med behörigheten HANTERA kan ge dig CREATE TABLE behörigheter i schemat.

Tabellkonfiguration

Innan du skapar ett fulltextsökningsindex måste bastabellen uppfylla följande:

  • Du måste skapa indexet i samma katalog och schema som bastabellen.
  • Tabellen är en hanterad Delta Lake-tabell eller en hanterad Iceberg-tabell.
  • Radspårning är aktiverat (delta.enableRowTracking = true). Se Radspårning i Azure Databricks.
  • Indexerade kolumner är av typen STRING, VARIANT, STRUCTeller ARRAY. STRING kolumner använder UTF8_BINARY sorteringen.
  • En STRUCT-kolumn innehåller minst ett lövfält av typen STRING, VARIANT eller ARRAY på valfri kapslingsnivå; andra lövfält ignoreras.
  • Tabellen använder inte några funktioner från listan över begränsningar, inklusive: OpenSharing, ytlig kloning, attributbaserade åtkomstkontroller, säkerhetsprinciper på radnivå och kolumnmasker. Se Begränsningar.

Information om tabellprotokollkrav som gäller för både Delta Lake- och Iceberg-tabeller finns i Delta Lake-funktionskompatibilitet och protokoll.

Skapa ett fulltextsökningsindex

Du kan skapa upp till fyra index i en enda tabell, var och en i en annan kolumn.

Använd CREATE SEARCH INDEX för att skapa ett index över en eller flera textkolumner. I följande exempel indexeras två textkolumner i en befintlig loggtabell:

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

Den fullständiga syntaxen är:

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

index_name måste vara unikt i schemat och kan inte matcha ett befintligt tabellnamn.

Information om hur texten tokeniseras finns i Alternativ.

Varning

Om CREATE SEARCH INDEX och REFRESH INDEX misslyckas mitt i körningen kör du REFRESH INDEX för att återställa från ett partiellt fel.

Alternativ

Satsen OPTIONS accepterar följande nycklar:

Key Värden Standardinställning Description
tokenizer ngram, split ngram Hur texten tokeniseras för indexering. Se Välj en tokenizer för ditt användningsfall.
ngram_size heltal i [3, 10] 5 Längden på de n-gram som genereras. Endast giltigt när tokenizer = 'ngram'.
min_token_length Heltal >= 1 3 Minimilängd för tokenens som ska behållas. Token som är kortare än detta tas bort under indexeringen. Endast giltigt när tokenizer = 'split'.

Detaljerad information om ogiltiga alternativfel finns i SEARCH_INDEX_INVALID_PARAMETERS felvillkor.

Välj en tokenizer för ditt användningsfall

Sökindex har två tillgängliga tokenizeralternativ, beroende på ditt användningsfall:

Tokeniserare Användningsfall Description
ngram Delsträngsmatchning. Delar upp text i överlappande n-gram av längden ngram_size.
split Inneslutningskontroller med hela ord. Delar upp text i ordtoken. En token består av en följd av Unicode-bokstäver (\p{L}) och kombinerande tecken (\p{M}); varje annat tecken är en avgränsare.

Så här skapar du ett n-gramindex med en n-gramstorlek på 4:

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

Så här skapar du ett split index med en minsta tokenlängd på 2:

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

Fråga efter data med hjälp av search och isearch

Azure Databricks har två SQL-funktioner för att testa om ett sökmönster finns i ett eller flera textmål:

  • search: Skiftlägeskänslig.
  • isearch: Skiftlägesokänslig.

Välj search eller isearch baserat på ditt krav på skiftlägeskänslighet. När de indexerade kolumnerna omfattas av ett fulltextsökningsindex använder Azure Databricks indexet för att hoppa över filer som garanterat inte innehåller matchande rader. Sökindex påverkar inte resultaten.

Index påskyndar frågorna mest när sökmönstret visas i en liten del av tabellens filer.

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

Arguments

search och isearch acceptera följande argument:

  • target måste vara av typen STRING, VARIANT, STRUCTeller ARRAY, samma typer som indexering tillåter. Målen dedupliceras.
  • pattern måste vara en strängliteral som inte är null.
  • mode anger hur pattern matchar varje target:
    • substring (standard): pattern matchas som en delsträng inom varje target.
    • word: pattern delas upp i ordtoken enligt samma regler som tokeniseraren split. Funktionen returnerar sant om varje ord i pattern visas i minst ett mål, oavsett ordning. Se Välj en tokenizer för ditt användningsfall.

Returns

search och isearch returnera ett BOOLEAN värde med trevärdeslogik:

  • true om minst ett mål som inte är null matchar.
  • null om inga målmatchningar som inte är null men minst ett mål är null.
  • false om alla mål inte är null och ingen matchar.

Exempel

I följande exempel visas vanliga search frågor och isearch frågor:

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

Hantera index

Viktigt!

Fulltextsökningsindex uppdateras inte automatiskt när bastabellen ändras. Se Uppdatera ett index.

Azure Databricks bibehåller frågekorrigeringen, oavsett indexens färskhet. När en tabell innehåller icke-indexerade data använder frågan det befintliga indexet för att påskynda åtkomsten till de indexerade posterna och använder en tabellsökning efter de icke-indexerade posterna.

Använd följande åtgärder för att hantera sökindex i fulltext:

Beskriva eller visa ett index

Så här visar du information om ett index:

DESCRIBE INDEX log_idx;

Uppdatera ett index

Fulltextsökningsindex uppdateras inte automatiskt när bastabellen ändras.

Om du vill uppdatera indexet lägger du till poster för nya rader:

REFRESH INDEX log_idx;

REFRESH INDEX är en inkrementell åtgärd där data endast läggs till. Det indexerar ny data men tar inte bort poster för rader som har tagits bort.

Om du vill uppdatera indexet, både lägga till poster för nya rader och ta bort poster för borttagna rader, använder du REFRESH INDEX ... FULL:

REFRESH INDEX log_idx FULL;

En fullständig uppdatering kräver mer beräkningsresurser än en inkrementell uppdatering. Med tiden leder inkrementella uppdateringar till att inaktuella poster ansamlas, vilket ökar indexets storlek och påverkar prestanda negativt.

Ta bort ett index

Om du vill släppa ett index kör du följande:

DROP INDEX log_idx;

Om du vill undvika ett fel för saknade index använder du:

DROP INDEX IF EXISTS log_idx;

Note

Om du släpper bastabellen släpper kommandot även sökindexen i fulltext.

Begränsningar

Sökindex i fulltext har följande begränsningar:

  • Det går inte att byta namn på en indexerad kolumn i bastabellen eller ändra dess datatyp.
  • Tabeller med OpenSharing stöds inte. Om du lägger till bastabellen som en OpenSharing-källa eller ett mål när du har skapat indexet ignorerar Azure Databricks sökindexet.
  • Tabeller med ytliga kloner stöds inte. Om du lägger till bastabellen som en ytlig klonkälla när du har skapat indexet ignorerar Azure Databricks sökindexet.
  • Tabeller med attributbaserade åtkomstkontroller, kolumnmasker eller säkerhetsprinciper på radnivå stöds inte. Om du lägger till någon av dessa kontroller i en tabell med ett sökindex ignorerar Azure Databricks sökindexet. Se Grundläggande begrepp för attributbaserad åtkomstkontroll (ABAC).