Melakukan pengambilan top-k yang efisien

Banyak aplikasi membuat kueri database untuk mengisi satu halaman di menggunakan berbagai aplikasi obrolan. Dalam aplikasi seperti itu, aplikasi tidak membutuhkan semua cocok, tetapi hanya top-k yang cocok berdasarkan tata urutan indeks. Telusuri indeks dapat menerapkan jenis penelusuran ini dengan sangat efisien. Halaman ini menjelaskan cara membuat dan mencari indeks yang memiliki kecocokan {i>top-k<i}.

Membuat indeks penelusuran untuk pencocokan top-k

Untuk mengonfigurasi indeks penelusuran pencocokan top-k, gunakan ORDER BY untuk mengurutkan indeks pencarian berdasarkan kolom tertentu. Kueri harus memiliki klausa ORDER BY yang sama persis dengan tata urutan indeks penelusuran (termasuk urutan naik versus arah menurun) dan klausa LIMIT yang meminta kueri untuk berhenti setelah menemukan baris yang cocok dengan k.

Anda juga dapat menerapkan penomoran halaman menggunakan klausa ini. Untuk informasi selengkapnya, lihat Nomori kueri penelusuran.

Untuk beberapa kasus penggunaan, sebaiknya pertahankan beberapa indeks penelusuran diurutkan berdasarkan kolom yang berbeda. Suka partisi, ini adalah kompromi antara penyimpanan dan biaya tulis versus latensi kueri.

Misalnya, perhatikan tabel yang menggunakan skema berikut:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  RecordTimestamp INT64 NOT NULL,
  ReleaseTimestamp INT64 NOT NULL,
  ListenTimestamp INT64 NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsRecordTimestampIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens)
ORDER BY RecordTimestamp DESC
STORING ListenTimestamp

CREATE SEARCH INDEX AlbumsReleaseTimestampIndex
ON Albums(AlbumTitle_Tokens)
ORDER BY ReleaseTimestamp DESC
STORING ListenTimestamp

Indeks penelusuran kueri untuk kecocokan top-k

Seperti yang disebutkan sebelumnya, kueri harus memiliki klausa ORDER BY yang sama persis dengan tata urutan indeks penelusuran (termasuk urutan naik versus arah menurun) dan klausa LIMIT yang meminta kueri untuk berhenti setelah menemukan baris yang cocok dengan k.

Berikut adalah beberapa kueri umum:

  • Kueri berikut sangat efisien. Fungsi ini memilih Indeks AlbumsRecordTimestampIndex. Bahkan jika ada banyak album dengan kata "happy", kueri hanya memindai sejumlah kecil baris:

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(AlbumTitle_Tokens, 'happy')
    ORDER BY RecordTimestamp DESC
    LIMIT 10
    
  • Kueri yang sama, meminta tata urutan berdasarkan ReleaseTimestamp dalam urutan menurun menggunakan indeks AlbumsReleaseTimestampIndex, serta sama-sama efisien:

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(AlbumTitle_Tokens, 'happy')
    ORDER BY ReleaseTimestamp DESC
    LIMIT 10
    
  • Pada saat yang sama, kueri yang meminta tata urutan berdasarkan ListenTimestamp tidak mengeksekusi kueri {i>top-k<i} secara efisien. Metode ini harus mengambil semua album yang cocok, mengurutkan hasil tersebut paling lambat ListenTimestamp, dan menampilkan 10 urutan teratas. Kueri semacam itu menggunakan sumber daya jika ada sejumlah besar dokumen yang berisi istilah "bahagia".

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(AlbumTitle_Tokens, 'happy')
    ORDER BY ListenTimestamp DESC
    LIMIT 10`
    
  • Demikian pula, kueri tidak akan berjalan secara efisien jika diminta bahwa hasil diurutkan menggunakan kolom RecordTimestamp dalam urutan menaik. Fitur ini memindai semua baris dengan kata "happy", meskipun memiliki LIMIT.

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(AlbumTitle_Tokens, 'happy')
    ORDER BY RecordTimestamp ASC
    LIMIT 10
    

Langkah selanjutnya