Combinare query a testo intero e non di testo

Questa pagina descrive come eseguire una ricerca che mescola dati a testo intero e non di testo.

Gli indici di ricerca supportano le colonne di testo completo, 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. L'ottimizzatore delle query tenta di ottimizzare i predicati non di testo con un indice di ricerca. Se questo non è possibile, Spanner valuta la condizione per ogni riga che corrisponde all'indice di ricerca. Le colonne a cui viene fatto riferimento non archiviate nell'indice di ricerca vengono recuperate dalla tabella di base.

Ad esempio, considera il seguente esempio:

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 su questa tabella è il seguente:

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

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • La query può combinare connessioni, disgiunzioni e negazioni in qualsiasi modo, incluso il mix di predicati di testo completo e non di testo. 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. Pertanto, il predicato a testo intero su Title e il predicato non di testo su Rating vengono accelerati, ma non il predicato su Likes. 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 di 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