Menggabungkan kueri teks lengkap dan non-teks

Halaman ini menjelaskan cara melakukan penelusuran yang menggabungkan data teks lengkap dan non-teks.

Indeks penelusuran mendukung kolom teks lengkap, pencocokan persis, dan numerik. Anda dapat menggabungkan kondisi teks dan non-teks dalam klausa WHERE, mirip dengan kueri penelusuran multi-kolom. Pengoptimal kueri mencoba mengoptimalkan predikat non-teks dengan indeks penelusuran. Jika hal itu tidak mungkin, Spanner akan mengevaluasi kondisi untuk setiap baris yang cocok dengan indeks penelusuran. Kolom yang dirujuk dan tidak disimpan dalam indeks penelusuran diambil dari tabel dasar.

Misalnya, perhatikan contoh berikut:

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;

Perilaku kueri pada tabel ini mencakup hal berikut:

  • Rating dan Genres disertakan dalam indeks penelusuran. Spanner mempercepat kondisi menggunakan daftar posting indeks penelusuran.

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Kueri dapat menggabungkan konjungsi, disjungsi, dan negasi dengan cara apa pun, termasuk menggabungkan predikat teks lengkap dan non-teks. Kueri ini sepenuhnya dipercepat oleh indeks penelusuran.

    SELECT Album
    FROM Albums
    WHERE (SEARCH(Title_Tokens, 'car')
           OR Rating > 4)
      AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Likes disimpan dalam indeks, tetapi skema tidak meminta Spanner untuk membuat indeks token untuk kemungkinan nilainya. Oleh karena itu, predikat teks lengkap di Title dan predikat non-teks di Rating dipercepat, tetapi predikat di Likes tidak. Di Spanner, kueri mengambil semua dokumen dengan istilah "mobil" di Title dan rating lebih dari 4, lalu memfilter dokumen yang tidak memiliki setidaknya 1.000 suka. Kueri ini menggunakan banyak resource jika hampir semua album memiliki istilah "mobil" dalam judulnya dan hampir semuanya memiliki rating 5, tetapi hanya sedikit album yang memiliki 1.000 suka. Dalam kasus seperti itu, pengindeksan Likes mirip dengan Rating akan menghemat resource.

    SELECT Album
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
      AND Likes >= 1000
    
  • Cover tidak disimpan dalam indeks. Kueri berikut melakukan gabungan balik antara AlbumsIndex dan Albums untuk mengambil Cover untuk semua album yang cocok.

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

Langkah selanjutnya