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:
TOKENLIST
berisi semua istilah asli dalam kueri.- 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 dalamTOKENLIST
, 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:
- Batas kedalaman pengambilan: jumlah baris maksimum yang akan diberi skor.
- 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
- Pelajari kueri penelusuran teks lengkap.
- Pelajari cara melakukan penelusuran substring.
- Pelajari cara memberi nomor halaman pada hasil penelusuran.
- Pelajari cara menggabungkan kueri teks lengkap dan non-teks.
- Pelajari cara menelusuri beberapa kolom.