Combinare query a testo intero e non di testo

In questa pagina viene descritto come eseguire una ricerca che combina testo completo e non testuale e i dati di Google Cloud.

Supporto della funzione Cerca negli indici a testo intero, a corrispondenza esatta e numeriche. Puoi combinare condizioni di testo e non di testo nella clausola WHERE in modo simile alle query di ricerca con più colonne. La lo strumento di ottimizzazione delle query cerca di ottimizzare i predicati non testuali con un indice di ricerca. Se impossibile, Spanner valuta la condizione per ogni riga che corrisponde all'indice di ricerca. Le colonne a cui si fa riferimento non archiviate nell'indice di ricerca vengono recuperate dalla tabella di base.

Considera ad esempio il seguente:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Rating FLOAT64,
  Genres ARRAY<STRING(MAX)>,
  Likes INT64,
  Cover BYTES(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
  Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING Likes;

Il comportamento delle query in questa tabella include quanto segue:

  • Rating e Genres sono inclusi nell'indice di ricerca. Spanner accelera le condizioni utilizzando gli elenchi di posting dell'indice di ricerca.

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • La query può combinare congiunzioni, disgiunzioni e negazioni in qualsiasi modo, compresa la combinazione di predicati di testo completo e non testuali. Questa query è completamente accelerata dall'indice di ricerca.

    SELECT Album
    FROM Albums
    WHERE (SEARCH(Title_Tokens, 'car')
           OR Rating > 4)
      AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Likes è archiviato nell'indice, ma lo schema non richiede a Spanner di creare un indice di token per i relativi possibili valori. Di conseguenza, il predicato integrale su Title e il predicato non testuale su Rating è accelerato, ma il predicato su Likes non lo è. In Spanner, la query recupera tutti i documenti con il termine "auto" in Title e una valutazione superiore a 4, quindi filtra i documenti che non hanno almeno 1000 Mi piace. Questa query utilizza molte risorse se quasi tutti gli album contengono il termine "auto" nel titolo e quasi tutti hanno una valutazione di 5, ma pochi album hanno 1000 Mi piace. In questi casi, l'indicizzazione Likes in modo simile a Rating consente di risparmiare risorse.

    SELECT Album
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
      AND Likes >= 1000
    
  • Cover non è memorizzato nell'indice. La seguente query esegue un join posteriore tra AlbumsIndex e Albums per recuperare Cover per tutti gli album corrispondenti.

    SELECT AlbumId, Cover
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
    

Passaggi successivi