Halaman ini menjelaskan cara menentukan peringkat hasil penelusuran untuk penelusuran teks lengkap di Spanner.
Spanner mendukung komputasi skor keaktualan, 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 cara melakukan penelusuran dengan peringkat menggunakan fungsi SCORE
:
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "fifth symphony")
ORDER BY SCORE(AlbumTitle_Tokens, "fifth symphony") DESC
PostgreSQL
Contoh ini menggunakan spanner.search
dengan
spanner.score
.
SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'fifth symphony')
ORDER BY spanner.score(albumtitle_tokens, 'fifth symphony') DESC
Memberi skor istilah kueri dengan fungsi SCORE
Fungsi SCORE
menghitung skor untuk setiap istilah kueri, lalu menggabungkan skor tersebut. Skor
per istilah secara kasar didasarkan pada frekuensi istilah–frekuensi dokumen terbalik
(TF/IDF). Skor adalah salah satu
komponen pengurutan akhir untuk data. Kueri menggabungkannya dengan sinyal
lainnya, 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
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. Kueri kemudian menggabungkan skor individual ini. Cara umum untuk melakukannya adalah dengan menjumlahkan setiap skor, lalu meningkatkannya sesuai dengan bobot kolom yang diberikan pengguna (yang diberikan menggunakan parameter kueri SQL).
Misalnya, kueri berikut menggabungkan output dari dua fungsi SCORE
:
GoogleSQL
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
PostgreSQL
Contoh ini menggunakan parameter kueri $1
dan $2
yang masing-masing terikat dengan 'fifth symphony' dan 'blue note'.
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, $1) AND spanner.search(studio_tokens, $2)
ORDER BY spanner.score(title_tokens, $1) * $titleweight
+ spanner.score(studio_tokens, $2) * $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
.
GoogleSQL
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
PostgreSQL
Contoh ini menggunakan parameter kueri $1
, $2
, $3
, $4
, $5
, dan $6
yang terikat dengan nilai yang ditentukan untuk titlequery
, studioquery
,
titleweight
, studioweight
, grammyweight
, dan freshnessweight
,
masing-masing.
SELECT albumid
FROM
(
SELECT
albumid,
spanner.score(title_tokens, $1) * $3 AS titlescore,
spanner.score(studio_tokens, $2) * $4 AS studioscore,
(extract(epoch FROM current_timestamp) * 10e+6 - releasetimestamp) / 8.64e+10 AS daysold,
(1 + CASE WHEN hasgrammy THEN $5 ELSE 0 END) AS popularityboost
FROM albums
WHERE spanner.search(title_tokens, $1) AND spanner.search(studio_tokens, $2)
) AS subquery
ORDER BY (subquery.TitleScore + subquery.studioscore)
* (1 + $6 * greatest(0, 30 - subquery.daysold) / 30) * subquery.popularityboost
LIMIT 25
TOKENLIST_CONCAT
juga dapat digunakan dalam penelusuran dan penskoran untuk menyederhanakan kueri jika
sesuai.
GoogleSQL
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
PostgreSQL
Contoh ini menggunakan
spanner.tokenlist_concat
.
Parameter kueri $1
terikat dengan 'blue note'.
SELECT albumid
FROM albums
WHERE spanner.search(spanner.tokenlist_concat(ARRAY[title_tokens, studio_tokens]), $1)
ORDER BY spanner.score(spanner.tokenlist_concat(ARRAY[title_tokens, studio_tokens]), $1)
LIMIT 25
Meningkatkan kecocokan urutan kueri
Spanner menerapkan peningkatan multiplikatif ke output
fungsi SCORE
untuk nilai yang berisi istilah kueri dalam urutan yang sama dengan
munculnya dalam kueri. Ada dua versi pengoptimalan ini: pencocokan parsial
dan pencocokan persis. Peningkatan pencocokan sebagian diterapkan jika:
TOKENLIST
berisi semua istilah asli dalam kueri.- 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 menerima 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 dalamTOKENLIST
, dan hal yang sama berlaku untuk istilah di sebelah kanan frasa.
Spanner menerapkan peningkatan pencocokan persis jika semua aturan sebelumnya benar, dan 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:
- Batas kedalaman pengambilan: jumlah maksimum baris yang akan diberi skor.
- Batas ukuran set hasil: jumlah maksimum baris yang harus ditampilkan oleh kueri (biasanya ukuran halaman).
Kueri dapat membatasi kedalaman pengambilan dengan subkueri SQL:
GoogleSQL
SELECT *
FROM (
SELECT AlbumId, Title_Tokens
FROM Albums
WHERE SEARCH(Title_Tokens, @p1)
ORDER BY ReleaseTimestamp DESC
LIMIT @retrieval_limit
)
ORDER BY SCORE(Title_Tokens, @p1)
LIMIT @page_size
PostgreSQL
Contoh ini menggunakan parameter kueri $1
, $2
, dan $3
yang terikat dengan nilai yang ditentukan untuk title_query
, retrieval_limit
, dan page_size
.
SELECT *
FROM (
SELECT albumid, title_tokens
FROM albums
WHERE spanner.search(title_tokens, $1)
ORDER BY releasetimestamp DESC
LIMIT $2
) AS subquery
ORDER BY spanner.score(subquery.title_tokens, $1)
LIMIT $3
Hal ini berfungsi sangat baik jika Spanner menggunakan sinyal peringkat yang paling penting untuk mengurutkan indeks.
Langkah berikutnya
- 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.