Membatasi hasil pencarian dengan RANK
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Fungsi CONTAINSTABLE dan FREETEXTTABLE mengembalikan kolom bernama RANK
yang berisi nilai ordinal dari 0 hingga 1000 (nilai peringkat). Nilai-nilai ini digunakan untuk memberi peringkat baris yang dikembalikan sesuai dengan seberapa baik baris tersebut cocok dengan kriteria pilihan. Nilai peringkat hanya menunjukkan urutan relevansi relatif dari baris dalam tataan hasil, dengan nilai yang lebih rendah menunjukkan relevansi yang lebih rendah. Nilai aktual tidak penting dan biasanya berbeda setiap kali kueri dijalankan.
Catatan
CONTAINS
Predikat dan FREETEXT
tidak mengembalikan nilai peringkat apa pun.
Jumlah item yang cocok dengan kondisi pencarian sering kali besar. Untuk mencegah CONTAINSTABLE
atau FREETEXTTABLE
mengkueri mengembalikan terlalu banyak kecocokan, gunakan parameter top_n_by_rank opsional, yang hanya mengembalikan subkumpulan baris. top_n_by_rank adalah nilai bilangan bulat, n, yang menentukan bahwa hanya n kecocokan berperingkat tertinggi yang akan dikembalikan, dalam urutan turun. Jika top_n_by_rank dikombinasikan dengan parameter lain, kueri dapat mengembalikan lebih sedikit baris daripada jumlah baris yang benar-benar cocok dengan semua predikat.
SQL Server mengurutkan kecocokan berdasarkan peringkat dan hanya mengembalikan hingga jumlah baris yang ditentukan. Pilihan ini dapat mengakibatkan peningkatan performa yang dramatis. Misalnya, kueri yang biasanya mengembalikan 100.000 baris dari tabel 1.000.000 baris diproses lebih cepat jika hanya 100 baris teratas yang diminta.
Contoh Penggunaan RANK untuk membatasi hasil pencarian
Contoh A: Hanya mencari tiga kecocokan teratas
Contoh berikut menggunakan CONTAINSTABLE
untuk mengembalikan hanya tiga kecocokan teratas.
USE AdventureWorks2022;
GO
SELECT K.RANK,
AddressLine1,
City
FROM Person.Address AS A
INNER JOIN CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON A.AddressID = K.[KEY];
GO
Berikut set hasilnya.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
Contoh B: Mencari lima kecocokan teratas
Contoh berikut menggunakan CONTAINSTABLE
untuk mengembalikan deskripsi lima produk teratas di mana Description
kolom berisi kata "aluminium" di dekat kata light
atau kata lightweight
.
USE AdventureWorks2022;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE(Production.ProductDescription,
Description, '(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
Bagaimana hasil kueri pencarian diberi peringkat
Pencarian teks lengkap di SQL Server dapat menghasilkan skor opsional (atau nilai peringkat) yang menunjukkan relevansi data yang dikembalikan oleh kueri teks lengkap. Nilai peringkat ini dihitung pada setiap baris dan dapat digunakan sebagai kriteria pengurutan untuk mengurutkan kumpulan hasil kueri tertentu berdasarkan relevansi. Nilai peringkat hanya menunjukkan urutan relevansi relatif baris dalam tataan hasil. Nilai aktual tidak penting dan biasanya berbeda setiap kali kueri dijalankan. Nilai peringkat tidak menampung signifikansi apa pun di seluruh kueri.
Statistik untuk peringkat
Saat indeks dibangun, statistik dikumpulkan untuk digunakan dalam peringkat. Proses membangun katalog teks lengkap tidak secara langsung menghasilkan satu struktur indeks. Sebagai gantinya, Mesin Teks Lengkap untuk SQL Server membuat indeks perantara saat data diindeks. Mesin Teks-Penuh kemudian menggabungkan indeks ini ke dalam indeks yang lebih besar sesuai kebutuhan. Proses ini dapat diulang berkali-kali. Mesin Teks Lengkap kemudian melakukan "penggabungan master" yang menggabungkan semua indeks perantara ke dalam satu indeks master besar.
Statistik dikumpulkan di setiap tingkat indeks menengah. Statistik digabungkan ketika indeks digabungkan. Beberapa nilai statistik hanya dapat dihasilkan selama proses penggabungan master.
Sementara SQL Server memberi peringkat kumpulan hasil kueri, SQL Server menggunakan statistik dari indeks perantara terbesar. Ini tergantung pada apakah indeks perantara digabungkan atau tidak. Akibatnya, statistik peringkat dapat bervariasi dalam akurasi jika indeks perantara tidak digabungkan. Ini menjelaskan mengapa kueri yang sama dapat mengembalikan hasil peringkat yang berbeda dari waktu ke waktu karena data terindeks teks lengkap ditambahkan, dimodifikasi, dan dihapus, dan karena indeks yang lebih kecil digabungkan.
Untuk meminimalkan ukuran indeks dan kompleksitas komputasi, statistik sering dibulatkan.
Daftar berikut ini mencakup beberapa istilah dan nilai statistik yang umum digunakan yang penting dalam menghitung peringkat.
Istilah /nilai | Deskripsi |
---|---|
Properti | Kolom baris terindeks teks lengkap. |
Surat | Entitas yang dikembalikan dalam kueri. Di SQL Server ini sesuai dengan baris. Dokumen dapat memiliki beberapa properti, sama seperti baris dapat memiliki beberapa kolom terindeks teks lengkap. |
Index | Satu indeks terbalik dari satu atau beberapa dokumen. Ini mungkin sepenuhnya dalam memori atau pada disk. Banyak statistik kueri relatif terhadap indeks individual tempat kecocokan terjadi. |
Katalog Teks Lengkap | Kumpulan indeks perantara yang diperlakukan sebagai satu entitas untuk kueri. Katalog adalah unit organisasi yang terlihat oleh administrator SQL Server. |
Word, token, atau item | Unit pencocokan di mesin teks lengkap. Aliran teks dari dokumen ditokenisasi menjadi kata-kata, atau token berdasarkan pemecah kata khusus bahasa. |
Kemunculan | Offset kata dalam properti dokumen sebagaimana ditentukan oleh pemecah kata. Kata pertama adalah pada kemunculan 1, berikutnya pada 2, dan sebagainya. Untuk menghindari positif palsu dalam kueri frasa dan kedekatan, akhir kalimat dan akhir paragraf memperkenalkan kesenjangan kemunculan yang lebih besar. |
TermFrequency | Berapa kali nilai kunci terjadi berturut-turut. |
IndexedRowCount | Jumlah total baris yang diindeks. Ini dihitung, berdasarkan jumlah yang dipertahankan dalam indeks perantara. Angka ini dapat bervariasi dalam akurasi. |
KeyRowCount | Jumlah total baris dalam katalog teks lengkap yang berisi kunci tertentu. |
MaxOccurrence | Kemunculan terbesar yang disimpan dalam katalog teks lengkap untuk properti tertentu secara berturut-turut. |
MaxQueryRank | Peringkat maksimum, 1000, dikembalikan oleh Mesin Teks-Penuh. |
Masalah komputasi peringkat
Proses peringkat komputasi, tergantung pada banyak faktor. Pemecah kata bahasa yang berbeda membuat token teks secara berbeda. Misalnya, string "rumah anjing" dapat dipecah menjadi "anjing" "rumah" dengan satu kata pemecah dan menjadi "rumah anjing" oleh yang lain. Ini berarti bahwa pencocokan dan peringkat bervariasi berdasarkan bahasa yang ditentukan, karena tidak hanya kata-kata yang berbeda, tetapi juga panjang dokumen. Perbedaan panjang dokumen dapat memengaruhi peringkat untuk semua kueri.
Statistik seperti IndexRowCount dapat sangat bervariasi. Misalnya, jika katalog memiliki 2 miliar baris dalam indeks master, maka satu dokumen baru diindeks ke dalam indeks perantara dalam memori, dan peringkat untuk dokumen tersebut berdasarkan jumlah dokumen dalam indeks dalam memori dapat condong dibandingkan dengan peringkat untuk dokumen dari indeks master. Untuk alasan ini, kami menyarankan bahwa setelah populasi apa pun yang menghasilkan sejumlah besar baris yang diindeks atau diindeks ulang, Anda menggabungkan indeks ke dalam indeks master menggunakan ALTER FULLTEXT CATALOG ... REORGANIZE
pernyataan Transact-SQL. Mesin Teks Lengkap juga secara otomatis menggabungkan indeks berdasarkan parameter seperti jumlah dan ukuran indeks menengah.
Nilai MaxOccurrence dinormalisasi menjadi 1 dari 32 rentang. Ini berarti, misalnya, bahwa dokumen yang panjangnya 50 kata, diperlakukan sama dengan dokumen yang panjangnya 100 kata. Berikut ini adalah tabel yang digunakan untuk normalisasi. Karena panjang dokumen berada dalam rentang antara nilai tabel yang berdekatan 32 dan 128, panjang dokumen secara efektif diperlakukan sebagai memiliki panjang yang sama, 128 (32 <docLength
<= 128).
{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585,
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363,
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };
Peringkat CONTAINSTABLE
Peringkat CONTAINSTABLE menggunakan algoritma berikut:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
Kecocokan frasa diberi peringkat seperti kunci individual kecuali bahwa KeyRowCount (jumlah baris yang berisi frasa) diperkirakan dan dapat tidak akurat dan lebih tinggi dari angka aktual.
Peringkat NEAR
CONTAINSTABLE
mendukung kueri untuk dua istilah pencarian atau lebih dalam jarak satu sama lain dengan menggunakan NEAR
opsi . Nilai peringkat dari setiap baris yang dikembalikan didasarkan pada beberapa parameter. Salah satu faktor peringkat utama adalah jumlah total kecocokan (atau hit) relatif terhadap panjang dokumen. Jadi, misalnya, jika dokumen 100 kata dan dokumen 900 kata berisi kecocokan yang identik, dokumen 100 kata diberi peringkat lebih tinggi.
Panjang total setiap temuan berturut-turut juga berkontribusi pada peringkat baris tersebut, berdasarkan jarak antara istilah pencarian pertama dan terakhir dari hit tersebut. Semakin kecil jaraknya, semakin banyak hit berkontribusi pada nilai peringkat baris. Jika kueri teks lengkap tidak menentukan bilangan bulat sebagai jarak maksimum, dokumen yang hanya berisi hit yang jaraknya lebih besar dari 100 istilah logis terpisah, memiliki peringkat 0.
Peringkat ISABOUT
CONTAINSTABLE
mendukung kueri untuk istilah tertimbang dengan menggunakan ISABOUT
opsi . ISABOUT
adalah kueri ruang vektor dalam terminologi pengambilan informasi tradisional. Algoritma peringkat default yang digunakan adalah Jaccard, rumus yang dikenal luas. Peringkat dihitung untuk setiap istilah dalam kueri lalu digabungkan, seperti yang dijelaskan dalam algoritma berikut.
ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank = ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 )
+ ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )
Peringkat FREETEXTTABLE
Peringkat FREETEXTTABLE didasarkan pada rumus peringkat OKAPI BM25. FREETEXTTABLE
kueri menambahkan kata-kata ke kueri melalui pembuatan infleksi (bentuk kata kueri asli); kata-kata ini diperlakukan sebagai kata-kata terpisah, tanpa hubungan khusus dengan kata-kata yang dihasilkan. Sinonim yang dihasilkan dari fitur Tesaurus diperlakukan sebagai istilah terpisah dan berbobot sama. Setiap kata dalam kueri berkontribusi pada peringkat.
Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where:
w is the Robertson-Sparck Jones weight.
In simplified form, w is defined as:
w = log10 ( ( ( r + 0.5 ) * ( N - R + r + 0.5 ) ) / ( ( R - r + 0.5 ) * ( n - r + 0.5 ) )
N is the number of indexed rows for the property being queried.
n is the number of rows containing the word.
K is ( k1 * ( ( 1 - b ) + ( b * dl / avdl ) ) ).
dl is the property length, in word occurrences.
avdl is the average length of the property being queried, in word occurrences.
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively.
tf is the frequency of the word in the queried property in a specific row.
qtf is the frequency of the term in the query.