Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Fungsi CONTAINSTABLE dan FREETEXTTABLE mengembalikan kolom bernama RANK yang berisi nilai ordinal dari 0 hingga 1.000 (nilai peringkat). Nilai-nilai ini memberi peringkat baris sesuai dengan seberapa cocok dengan kriteria seleksi. 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 berjalan.
Catatan
CONTAINS Predikat dan FREETEXT tidak mengembalikan nilai peringkat apa pun.
Jumlah item yang cocok dengan kondisi pencarian sering kali besar. Untuk mencegah kueri CONTAINSTABLE atau FREETEXTTABLE mengembalikan terlalu banyak kecocokan, gunakan parameter opsional top_n_by_rank. Hanya mengembalikan sebagian baris.
top_n_by_rank adalah nilai bilangan bulat, n, yang menentukan bahwa hanya n kecocokan peringkat tertinggi yang dikembalikan, dalam urutan menurun. 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.
Mesin Database SQL Server mengurutkan kecocokan berdasarkan peringkat dan hanya mengembalikan hingga jumlah baris yang ditentukan. 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 penelusuran
Contoh A: Hanya mencari tiga kecocokan teratas
Contoh berikut menggunakan CONTAINSTABLE untuk menghasilkan hanya tiga hasil teratas.
USE AdventureWorks2025;
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 kumpulan hasil.
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 terbaik
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 AdventureWorks2025;
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 dapat menghasilkan skor opsional (atau nilai peringkat) yang menunjukkan relevansi data yang ditampilkan 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 memiliki signifikansi dalam berbagai kueri.
Statistik untuk peringkat
Saat Anda membuat indeks, sistem mengumpulkan statistik untuk digunakan dalam peringkat. Membuat katalog teks lengkap tidak secara langsung membuat satu struktur indeks. Sebagai gantinya, Full-Text Engine membuat indeks perantara saat mengindeks data. Mesin Teks-Penuh kemudian menggabungkan indeks ini ke dalam indeks yang lebih besar sesuai kebutuhan. Proses ini bisa terjadi 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 akan digabungkan saat indeks digabungkan. Beberapa nilai statistik hanya dapat dihasilkan selama proses penggabungan master.
Sementara Database Engine memberi peringkat kumpulan hasil kueri, ia menggunakan statistik dari indeks perantara terbesar. Penggunaan ini bergantung pada apakah indeks perantara digabungkan. Akibatnya, statistik peringkat dapat bervariasi dalam akurasi jika indeks perantara tidak digabungkan. Perbedaan akurasi ini menjelaskan mengapa kueri yang sama dapat mengembalikan hasil peringkat yang berbeda dari waktu ke waktu saat data terindeks teks lengkap ditambahkan, dimodifikasi, dan dihapus, dan saat 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. |
| Dokumen | Entitas yang dikembalikan dalam kueri. Dalam Database Engine, ini berkorespondensi dengan sebuah 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 di mana kecocokan terjadi. |
| Katalog Teks Lengkap | Kumpulan indeks perantara yang diperlakukan sebagai satu entitas untuk kueri. Katalog adalah apa yang dilihat administrator sebagai unit organisasi. |
| Word, token, atau item | Unit pencocokan dalam mesin pencari teks lengkap. Aliran teks dari dokumen ditokenisasi menjadi kata-kata atau token oleh pemecah kata khusus bahasa. |
| Kemunculan | Posisi kata dalam properti dokumen sebagaimana ditentukan oleh pemecah kata. Kata pertama muncul pada urutan ke-1, berikutnya pada ke-2, dan seterusnya. 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 muncul berturut-turut. |
| IndexedRowCount | Jumlah total baris yang diindeks. Nilai 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 Full-Text Engine. |
Masalah komputasi peringkat
Banyak faktor yang mempengaruhi proses komputasi peringkat. Pemecah kata dalam berbagai bahasa memecah teks menjadi token dengan cara yang berbeda. Misalnya, satu pemecah kata memecah string "rumah anjing" menjadi "anjing" dan "rumah", tetapi pemecah kata lain memperlakukannya sebagai "rumah anjing". 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, satu dokumen baru diindeks ke dalam indeks perantara dalam memori, dan peringkat untuk dokumen tersebut berdasarkan jumlah dokumen dalam indeks dalam memori dapat miring dibandingkan dengan peringkat untuk dokumen dari indeks master. Untuk alasan ini, setelah populasi apa pun yang menghasilkan sejumlah besar baris yang diindeks atau diindeks ulang, gabungkan indeks ke dalam indeks master dengan 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. Normalisasi ini berarti, misalnya, bahwa dokumen sepanjang 50 kata diperlakukan sama dengan dokumen sepanjang 100 kata. Tabel berikut menunjukkan 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 )
Pencocokan frasa diberi peringkat sama seperti kunci individual, kecuali bahwa KeyRowCount (jumlah baris yang berisi frasa), adalah nilai perkiraan yang mungkin tidak akurat dan lebih tinggi dari angka sebenarnya.
Peringkat NEAR
CONTAINSTABLE mendukung kueri untuk dua atau lebih kata pencarian dalam jarak dekat dengan menggunakan opsi NEAR. 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 besar kontribusi hit terhadap nilai peringkat baris. Jika kueri teks penuh tidak menentukan bilangan bulat sebagai jarak maksimum, dokumen yang hanya berisi kecocokan yang jaraknya lebih dari 100 istilah logis satu sama lain memiliki peringkat 0.
Peringkat ISABOUT
CONTAINSTABLE mendukung kueri istilah tertimbang dengan menggunakan opsi ISABOUT.
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 ke dalam kueri melalui pembentukan bentuk infleksi (bentuk berinfleksi dari kata-kata asli dalam kueri). Kata-kata ini diperlakukan sebagai kata-kata terpisah, tanpa hubungan khusus dengan kata-kata dari mana kata-kata itu 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.