Beri peringkat hasil penelusuran

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

Spanner mendukung komputasi skor topikalitas, yang memberikan dasar untuk membuat fungsi peringkat yang canggih. Skor ini menghitung relevansi hasil dengan kueri, berdasarkan istilah kueri frekuensi dan opsi kustom lainnya.

Contoh berikut menunjukkan penelusuran berperingkat:

SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, @p)
ORDER BY SCORE(AlbumTitle_Tokens, @p) DESC

Tentukan skor istilah kueri dengan fungsi SCORE

SCORE menghitung skor untuk setiap istilah kueri dan kemudian menggabungkan skor. Skor per jangka waktu kurang lebih didasarkan pada dokumen frekuensi–invers jangka waktu frekuensi (TF/IDF). Skornya adalah satu komponen dari pengurutan akhir untuk sebuah {i>record<i}. Kueri tersebut menggabungkannya dengan sinyal lain, seperti keaktualan yang memodulasi skor topikalitas.

Dalam penerapan saat ini, bagian IDF dari TF/IDF hanya tersedia jika enhance_query=>true digunakan. Model ini menghitung frekuensi relatif dari kata-kata berdasarkan korpus web lengkap yang digunakan Google Penelusuran, bukan indeks pencarian spesifik. Jika peningkatan kueri tidak diaktifkan, penskoran saja menggunakan komponen istilah frekuensi (TF) (yaitu, istilah IDF ditetapkan ke 1).

Biasanya, opsi enhance_query akan sama di kedua SEARCH serta fungsi SCORE.

Fungsi SCORE menampilkan nilai yang berfungsi sebagai skor relevansi yang Spanner digunakan untuk menetapkan tata urutan. Mereka tidak memiliki artinya. Semakin tinggi skor, semakin baik kecocokannya dengan kueri.

Memberi skor di beberapa kolom

Spanner menggunakan fungsi SCORE untuk menilai setiap kolom satu per satu. Kueri tersebut kemudian menggabungkan skor individual tersebut. Tanda umum cara untuk melakukannya adalah dengan menjumlahkan skor individu, lalu meningkatkannya sesuai dengan bobot kolom yang disediakan pengguna (yang diberikan menggunakan 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 peningkatan:

  • Keaktualan (FreshnessBoost) meningkatkan skor dengan (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30)
  • Popularitas(PopularityBoost) meningkatkan skor dengan mengalikannya 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

Kecocokan urutan kueri peningkatan

Anda dapat menerapkan peningkatan multiplikatif pada skor topikalitas untuk nilai berisi istilah kueri dalam urutan yang sama dengan yang muncul di kueri. Ada adalah dua versi peningkatan ini: pencocokan parsial dan pencocokan persis. Kecocokan parsial boost diterapkan jika:

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

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

  • Kueri dengan negasi tidak dapat menerima peningkatan kecocokan parsial.
  • Kueri dengan konjungsi menerima peningkatan jika bagian dari kata sambung muncul di lokasi yang sesuai.
  • Kueri dengan frasa menerima peningkatan jika frasa muncul dalam TOKENLIST, dan istilah di sebelah kiri frasa dalam kueri tampaknya di sebelah kiri frasa dalam TOKENLIST, dan hal yang sama berlaku untuk istilah di sebelah kanan frasa.

Spanner menerapkan peningkatan kecocokan persis ketika semua aturannya benar. Token pertama dan terakhir dalam kueri adalah token pertama dan terakhir token tertentu dalam dokumen.

Contoh dokumen: Jembatan di Atas Air Bermasalah

Kueri Booster Diterapkan
Jembatan Mengalami Masalah tidak ada dorongan
Bridge Over - perairan lain tidak ada dorongan
Perairan Jembatan (Di Atas ATAU Masalah) tidak ada dorongan
Jembatan di Atas peningkatan parsial
Bridge Over (Bermasalah ATAU Air) peningkatan parsial
Jembatan Di Atas Air Bermasalah peningkatan yang tepat
Jembatan "Bermasalah" Air minum peningkatan yang tepat
Jembatan ("Terhadap Masalah" ATAU air yang hilang) peningkatan yang tepat

Kedalaman pengambilan batas

Indeks penelusuran sering kali berisi jutaan dokumen. Untuk kueri di mana predikat memiliki selektivitas rendah, tidak praktis untuk mengurutkan semua hasil. Kueri penskoran biasanya memiliki dua batasan:

  1. Batas kedalaman pengambilan: jumlah baris maksimum yang akan diberi skor.
  2. Batas ukuran kumpulan hasil: jumlah baris maksimum yang boleh dicapai kueri tampilkan (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 akan berfungsi sangat baik jika Spanner menggunakan untuk mengurutkan indeks.

Langkah selanjutnya