Mengurutkan hasil penelusuran

Halaman ini menjelaskan cara menentukan peringkat hasil penelusuran untuk penelusuran teks lengkap di Spanner.

Spanner mendukung komputasi skor topikalitas, yang menyediakan blok penyusun untuk membuat fungsi peringkat yang canggih. Skor ini menghitung relevansi hasil terhadap kueri, berdasarkan frekuensi istilah kueri dan opsi lain yang dapat disesuaikan.

Contoh berikut menunjukkan penelusuran yang diberi peringkat:

SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "fifth symphony")
ORDER BY SCORE(AlbumTitle_Tokens, "fifth symphony") DESC

Memberi skor istilah kueri dengan fungsi SCORE

Fungsi SCORE menghitung skor untuk setiap istilah kueri, lalu menggabungkan skor. Skor per istilah secara kasar didasarkan pada frekuensi istilah–frekuensi dokumen invers (TF/IDF). Skor adalah satu komponen pengurutan akhir untuk kumpulan data. Kueri menggabungkannya dengan sinyal lain, seperti keaktualan yang memodulasi skor keaktualan.

Dalam implementasi saat ini, bagian IDF dari TF/IDF hanya tersedia jika enhance_query=>true digunakan. Alat ini menghitung frekuensi relatif kata-kata berdasarkan korpus web lengkap yang digunakan oleh Google Penelusuran, bukan indeks penelusuran tertentu. Jika peningkatan rquery tidak diaktifkan, penskoran hanya menggunakan komponen frekuensi istilah (TF) (yaitu, istilah IDF ditetapkan ke 1).

Fungsi SCORE menampilkan nilai yang berfungsi sebagai skor relevansi yang digunakan Spanner untuk menetapkan urutan pengurutan. Nilai ini tidak memiliki makna mandiri. Makin tinggi skornya, makin baik kecocokannya dengan kueri.

Biasanya argumen seperti query dan enhance_query sama di seluruh fungsi SEARCH dan SCORE untuk memastikan konsistensi dalam pengambilan dan peringkat.

Cara yang direkomendasikan untuk melakukannya adalah menggunakan argumen ini dengan parameter kueri, bukan literal string, dan menentukan parameter kueri yang sama dalam fungsi SEARCH dan SCORE.

Memberikan skor ke beberapa kolom

Spanner menggunakan fungsi SCORE untuk menilai setiap kolom secara terpisah. Kemudian, kueri akan menggabungkan masing-masing skor ini. Cara umum untuk melakukannya adalah dengan menjumlahkan skor individual, lalu meningkatkannya sesuai dengan bobot kolom yang diberikan pengguna (yang diberikan menggunakan parameter kueri SQL).

Misalnya, kueri berikut menggabungkan output dari dua fungsi SCORE:

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY SCORE(Title_Tokens, @p1) * @titleweight + SCORE(Studio_Tokens, @p2) * @studioweight
LIMIT 25

Contoh berikut menambahkan dua parameter boost:

  • Keaktualan (FreshnessBoost) meningkatkan skor dengan (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30)
  • Popularitas(PopularityBoost) meningkatkan skor dengan mengalikan skor tersebut dengan faktor (1 + IF(HasGrammy, @grammyweight, 0).

Agar mudah dibaca, kueri menggunakan operator WITH.

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY WITH(
  TitleScore AS SCORE(Title_Tokens, @p1) * @titleweight,
  StudioScore AS SCORE(Studio_Tokens, @p2) * @studioweight,
  DaysOld AS (UNIX_MICROS(CURRENT_TIMESTAMP()) - ReleaseTimestamp) / 8.64e+10,
  FreshnessBoost AS (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30),
  PopularityBoost AS (1 + IF(HasGrammy, @grammyweight, 0)),
  (TitleScore + StudioScore) * FreshnessBoost * PopularityBoost)
LIMIT 25

TOKENLIST_CONCAT juga dapat digunakan dalam penelusuran dan penskoran untuk menyederhanakan kueri jika sesuai:

SELECT AlbumId
FROM Albums
WHERE SEARCH(TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens]), @p)
ORDER BY SCORE(TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens]), @p)
LIMIT 25

Meningkatkan kecocokan urutan kueri

Anda dapat menerapkan peningkatan multiplikatif pada skor keaktualan untuk nilai yang berisi istilah kueri dalam urutan yang sama seperti yang muncul dalam kueri. Ada dua versi pengoptimalan ini: pencocokan sebagian dan pencocokan persis. Peningkatan kecocokan parsial diterapkan jika:

  1. TOKENLIST berisi semua istilah asli dalam kueri.
  2. Token berdekatan satu sama lain, dan dalam urutan yang sama seperti yang muncul dalam kueri.

Ada aturan khusus tertentu untuk konjungsi, negasi, dan frasa:

  • Kueri dengan negasi tidak dapat menerima peningkatan pencocokan sebagian.
  • Kueri dengan konjungsi akan mendapatkan peningkatan jika bagian konjungsi muncul di lokasi yang sesuai.
  • Kueri dengan frasa akan menerima peningkatan jika frasa muncul di TOKENLIST, dan istilah di sebelah kiri frasa dalam kueri muncul di sebelah kiri frasa dalam TOKENLIST, dan hal yang sama berlaku untuk istilah di sebelah kanan frasa.

Spanner menerapkan pengoptimalan pencocokan persis jika semua aturan sebelumnya benar. Token pertama dan terakhir dalam kueri adalah token pertama dan terakhir dalam dokumen.

Contoh dokumen: Bridge Over Troubled Water

Kueri Peningkatan Diterapkan
Jembatan Bermasalah tanpa boost
Jembatan - air lainnya tanpa boost
Jembatan (Di Atas ATAU Bermasalah) Air tanpa boost
Bridge Over peningkatan parsial
Jembatan (Air ATAU Bermasalah) peningkatan parsial
Bridge Over Troubled Water peningkatan persis
Jembatan "Di Atas Air yang Bermasalah" peningkatan persis
Jembatan ("Over Troubled" ATAU missingterm) Air peningkatan persis

Membatasi kedalaman pengambilan

Indeks penelusuran sering kali berisi jutaan dokumen. Untuk kueri dengan prediket yang memiliki daya pilih rendah, tidak praktis untuk memberi peringkat pada semua hasil. Kueri penskoran biasanya memiliki dua batas:

  1. Batas kedalaman pengambilan: jumlah maksimum baris yang akan diberi skor.
  2. Batas ukuran set hasil: jumlah maksimum baris yang harus ditampilkan oleh kueri (biasanya ukuran halaman).

Kueri dapat membatasi kedalaman pengambilan dengan subkueri SQL:

SELECT *
FROM (
  SELECT AlbumId
  FROM Albums
  WHERE SEARCH(Title_Tokens, @p1)
  ORDER BY ReleaseTimestamp DESC
  LIMIT @retrieval_limit
)
ORDER BY SCORE(Title_Tokens, @p1)
LIMIT @page_size

Hal ini berfungsi sangat baik jika Spanner menggunakan sinyal peringkat yang paling penting untuk mengurutkan indeks.

Langkah selanjutnya