Eseguire una ricerca di sottostringhe

Oltre alla corrispondenza esatta dei token, gli indici di ricerca di Spanner supportano le ricerche di sottostringhe. Questa pagina descrive come eseguire una ricerca di sottostringhe nell'ambito di una ricerca full-text in Spanner.

Le ricerche di sottostringhe hanno le seguenti caratteristiche:

  • Non fa distinzione tra maiuscole e minuscole, ignora la maggior parte della punteggiatura e normalizza gli spazi vuoti.
  • Nessuna segmentazione cinese, giapponese e coreana (CJK), poiché le query CJK parziali vengono spesso segmentate in modo errato.
  • Per più termini di ricerca, il risultato deve contenere una sottostringa di ciascun termine. Ad esempio, 'happ momen' corrisponde a "happy moment", perché entrambe le sottostringhe si trovano nel testo. Non corrisponde a "happy day".

Esempi

Testo memorizzato Query di sottostringa Corrispondenza
Bridge over Troubled Water ridg roub
Bridge over Troubled Water ridg , roub
Bridge over Troubled Water over brid
Bridge over Troubled Water ponte ate
Bridge over Troubled Water Ponte ponte ponte
Bridge over Troubled Water bri trou ter
Bridge over Troubled Water bri dge
Bridge over Troubled Water troubledwater No
Bridge over Troubled Water trubled No

Per una ricerca di sottostringhe, utilizza la funzione TOKENIZE_SUBSTRING nella definizione della colonna TOKENLIST, come mostrato nel seguente esempio di DDL:

GoogleSQL

CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsTitleIndex ON Albums(AlbumTitle_Tokens);

PostgreSQL

Questo esempio utilizza spanner.tokenize_substring.

CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
    GENERATED ALWAYS AS (spanner.tokenize_substring(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

CREATE SEARCH INDEX albumstitleindex ON albums(albumtitle_tokens);

Nella query SQL, utilizza la funzione SEARCH_SUBSTRING nella clausola WHERE. Ad esempio, la seguente query corrisponde a un album con il titolo "happy" della tabella creata nell'esempio precedente:

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');

PostgreSQL

Questo esempio utilizza spanner.search_substring.

SELECT albumid
FROM albums
WHERE spanner.search_substring(albumtitle_tokens, 'happ');

TOKENIZE_SUBSTRING genera n-grammi per ogni token e li memorizza nell'indice di ricerca. La lunghezza minima e massima degli n-grammi da generare viene configurata tramite argomenti facoltativi.

Gli indici di ricerca di sottostringhe possono utilizzare uno spazio di archiviazione 10-30 volte superiore rispetto agli indici full-text sugli stessi dati, perché la tokenizzazione produce molti più token. Ciò è particolarmente vero se la differenza tra ngram_size_min e ngram_size_max aumenta. Anche le query di sottostringa utilizzano più risorse per l'esecuzione.

Come TOKENIZE_FULLTEXT, puoi configurare TOKENIZE_SUBSTRING per utilizzare tipi specifici di contenuti.

Oltre alla ricerca di sottostringhe di base, SEARCH_SUBSTRING supporta la modalità di ricerca relativa. Una ricerca relativa perfeziona i risultati della ricerca di sottostringhe.

Per attivare la modalità di ricerca relativa, imposta il parametro relative_search_types di TOKENIZE_SUBSTRING su un array non vuoto con elementi dei tipi di ricerca relativa supportati.

Quando la ricerca relativa è attivata nella tokenizzazione, SEARCH_SUBSTRING può eseguire query con i seguenti tipi di ricerca relativa:

  • phrase: corrisponde a sottostringhe contigue

    Esempi

    Testo memorizzato Query di sottostringa. Corrispondenza
    Bridge over Troubled Water bridge over
    Bridge over Troubled Water Ponte ponte ponte No
    Bridge over Troubled Water brid over No
    Bridge over Troubled Water dorsale sopra il problema
    Bridge over Troubled Water bridge ove troubled No
    Bridge over Troubled Water idge ove
    Bridge over Troubled Water idge , ove
    Bridge over Troubled Water RIDGE OVE
    Bridge over Troubled Water acqua del ponte No
  • value_prefix: corrisponde alle sottostringhe contigue e la corrispondenza deve iniziare all'inizio del valore. Questo è concettualmente simile alla funzione STARTS_WITH per le stringhe normalizzate per maiuscole/minuscole e spazi bianchi.

    Esempi

    Testo memorizzato Query di sottostringa Corrispondenza
    Bridge over Troubled Water bridge over
    Bridge over Troubled Water ponte , sopra
    Bridge over Troubled Water dorsale No
    Bridge over Troubled Water acque agitate No
  • value_suffix: corrisponde alle sottostringhe contigue e la corrispondenza deve avvenire alla fine del valore. Questo è concettualmente simile alla funzione ENDS_WITH per le stringhe normalizzate per maiuscole/minuscole e spazi bianchi.

    Esempi

    Testo memorizzato Query di sottostringa. Corrispondenza
    Bridge over Troubled Water acque agitate
    Bridge over Troubled Water acqua ; torbida
    Bridge over Troubled Water acqua torbida
    Bridge over Troubled Water troubled wate No
    Bridge over Troubled Water acqua torbida No
    Bridge over Troubled Water bridge over No
  • word_prefix: come value_prefix, ma la stringa deve corrispondere a un limite di termine (anziché a un limite di valore).

    Esempi

    Testo memorizzato Query di sottostringa Corrispondenza
    Bridge over Troubled Water over trouble
    Bridge over Troubled Water Oltre , problemi
    Bridge over Troubled Water acqua torbida No
    Bridge over Troubled Water sopra l'acqua No
    Bridge over Troubled Water ove troubled No
    Bridge over Troubled Water ver troubled
  • word_suffix: come value_suffix, ma la stringa deve corrispondere alla fine di un limite del termine.

    Esempi

    Testo memorizzato Query di sottostringa Corrispondenza
    Bridge over Troubled Water ver troubled
    Bridge over Troubled Water over trouble No
    Bridge over Troubled Water sopra l'acqua No
    Bridge over Troubled Water ove troubled No

Passaggi successivi