CONTAINSTABLE (Transact-SQL)
Berlaku untuk: SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Mengembalikan tabel nol, satu, atau beberapa baris untuk kolom yang berisi kecocokan tepat atau fuzzy (kurang tepat) dengan satu kata dan frasa, kedekatan kata dalam jarak tertentu satu sama lain, atau kecocokan tertimbang. CONTAINSTABLE digunakan dalam klausa FROM dari pernyataan Transact-SQL SELECT dan dirujuk seolah-olah itu adalah nama tabel biasa. Ini melakukan pencarian teks lengkap SQL Server pada kolom terindeks teks lengkap yang berisi jenis data berbasis karakter.
CONTAINSTABLE berguna untuk jenis kecocokan yang sama dengan predikat CONTAINS dan menggunakan kondisi pencarian yang sama dengan CONTAINS.
Namun, tidak seperti CONTAINS, kueri yang menggunakan CONTAINSTABLE mengembalikan nilai peringkat relevansi (RANK) dan kunci teks lengkap (KEY) untuk setiap baris. Untuk informasi tentang formulir pencarian teks lengkap yang didukung oleh SQL Server, lihat Kueri dengan Pencarian Teks Lengkap.
Sintaks
CONTAINSTABLE
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '
[ , LANGUAGE language_term]
[ , top_n_by_rank ]
)
<contains_search_condition> ::=
{ <simple_term>
| <prefix_term>
| <generation_term>
| <generic_proximity_term>
| <custom_proximity_term>
| <weighted_term>
}
| { ( <contains_search_condition> )
{ { AND | & } | { AND NOT | &! } | { OR | | } }
<contains_search_condition> [ ...n ]
}
<simple_term> ::=
{ word | "phrase" }
<prefix term> ::=
{ "word*" | "phrase*" }
<generation_term> ::=
FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] )
<generic_proximity_term> ::=
{ <simple_term> | <prefix_term> } { { { NEAR | ~ }
{ <simple_term> | <prefix_term> } } [ ...n ] }
<custom_proximity_term> ::=
NEAR (
{
{ <simple_term> | <prefix_term> } [ ,...n ]
|
( { <simple_term> | <prefix_term> } [ ,...n ] )
[, <maximum_distance> [, <match_order> ] ]
}
)
<maximum_distance> ::= { integer | MAX }
<match_order> ::= { TRUE | FALSE }
<weighted_term> ::=
ISABOUT
( { {
<simple_term>
| <prefix_term>
| <generation_term>
| <proximity_term>
}
[ WEIGHT ( weight_value ) ]
} [ ,...n ]
)
Argumen
tabel
Adalah nama tabel yang telah diindeks teks lengkap.
tabel dapat berupa nama objek database satu, dua, tiga, atau empat bagian. Saat mengkueri tampilan, hanya satu tabel dasar terindeks teks lengkap yang dapat terlibat.
tabel tidak dapat menentukan nama server dan tidak dapat digunakan dalam kueri terhadap server tertaut.
column_name
Adalah nama satu atau beberapa kolom yang diindeks untuk pencarian teks lengkap. Kolom dapat berjenis char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary, atau varbinary(max).
column_list
Menunjukkan bahwa beberapa kolom, yang dipisahkan oleh koma, dapat ditentukan.
column_list harus diapit tanda kurung. Kecuali language_term ditentukan, bahasa semua kolom column_list harus sama.
*
Menentukan bahwa semua kolom terindeks teks lengkap dalam tabel harus digunakan untuk mencari kondisi pencarian yang diberikan. Kecuali language_term ditentukan, bahasa semua kolom tabel harus sama.
LANGUAGE_TERM BAHASA
Adalah bahasa yang sumber dayanya akan digunakan untuk pemecahan kata, stemming, dan penghapusan tesaurus dan kata bising (atau stopword) sebagai bagian dari kueri. Parameter ini bersifat opsional dan dapat ditentukan sebagai string, bilangan bulat, atau nilai heksadesimal yang sesuai dengan pengidentifikasi lokal (LCID) bahasa. Jika language_term ditentukan, bahasa yang diwakilinya akan diterapkan ke semua elemen kondisi pencarian. Jika tidak ada nilai yang ditentukan, kolom bahasa teks lengkap digunakan.
Jika dokumen dari bahasa yang berbeda disimpan bersama-sama sebagai objek besar biner (BLOB) dalam satu kolom, pengidentifikasi lokal (LCID) dari dokumen tertentu menentukan bahasa apa yang digunakan untuk mengindeks kontennya. Saat mengkueri kolom seperti itu, menentukan LANGUAGE**language_term dapat meningkatkan probabilitas kecocokan yang baik.
Saat ditentukan sebagai string, language_term sesuai dengan nilai kolom alias dalam tampilan kompatibilitas sys.syslanguages. String harus diapit dalam tanda kutip tunggal, seperti dalam 'language_term'. Ketika ditentukan sebagai bilangan bulat, language_term adalah LCID aktual yang mengidentifikasi bahasa. Ketika ditentukan sebagai nilai heksadesimal, language_term adalah 0x diikuti oleh nilai heksadesimal LCID. Nilai heksadesimal tidak boleh melebihi delapan digit, termasuk nol di depannya.
Jika nilai dalam format kumpulan karakter byte ganda (DBCS), Microsoft SQL Server akan mengonversinya ke Unicode.
Jika bahasa yang ditentukan tidak valid atau tidak ada sumber daya yang diinstal yang sesuai dengan bahasa tersebut, SQL Server mengembalikan kesalahan. Untuk menggunakan sumber daya bahasa netral, tentukan 0x0 sebagai language_term.
top_n_by_rank
Menentukan bahwa hanya n kecocokan berperingkat tertinggi, dalam urutan turun, yang dikembalikan. Hanya berlaku ketika nilai bilangan bulat, n, ditentukan. 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.
top_n_by_rank memungkinkan Anda meningkatkan performa kueri dengan hanya mengingat hit yang paling relevan.
<contains_search_condition>
Menentukan teks yang akan dicari di column_name dan kondisi untuk kecocokan. Untuk informasi tentang kondisi pencarian, lihat CONTAINS (Transact-SQL).
Keterangan
Predikat teks lengkap dan fungsi bekerja pada satu tabel, yang tersirat dalam predikat FROM. Untuk mencari di beberapa tabel, gunakan tabel yang digabungkan dalam klausa FROM Anda untuk mencari pada tataan hasil yang merupakan produk dari dua tabel atau lebih.
Tabel yang dikembalikan memiliki kolom bernama KEY yang berisi nilai kunci teks lengkap. Setiap tabel terindeks teks lengkap memiliki kolom yang nilainya dijamin unik, dan nilai yang dikembalikan dalam kolom KEY adalah nilai kunci teks lengkap dari baris yang cocok dengan kriteria pilihan yang ditentukan dalam berisi kondisi pencarian. Properti TableFulltextKeyColumn , yang diperoleh dari fungsi OBJECTPROPERTYEX, menyediakan identitas kolom kunci unik ini. Untuk mendapatkan ID kolom yang terkait dengan kunci teks lengkap indeks teks lengkap, gunakan sys.fulltext_indexes. Untuk informasi selengkapnya, lihat sys.fulltext_indexes (Transact-SQL).
Untuk mendapatkan baris yang Anda inginkan dari tabel asli, tentukan gabungan dengan baris CONTAINSTABLE. Bentuk umum klausa FROM untuk pernyataan SELECT menggunakan CONTAINSTABLE adalah:
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
ON FT_TBL.unique_key_column = KEY_TBL.[KEY];
Tabel yang dihasilkan oleh CONTAINSTABLE menyertakan kolom bernama RANK. Kolom RANK adalah nilai (dari 0 hingga 1000) untuk setiap baris yang menunjukkan seberapa baik baris cocok dengan kriteria pilihan. Nilai peringkat ini biasanya digunakan dalam salah satu cara ini dalam pernyataan SELECT:
Dalam klausa ORDER BY untuk mengembalikan baris peringkat tertinggi sebagai baris pertama dalam tabel.
Dalam daftar pilih untuk melihat nilai peringkat yang ditetapkan untuk setiap baris.
Izin
Izin eksekusi hanya tersedia oleh pengguna dengan hak istimewa SELECT yang sesuai pada tabel atau kolom tabel yang dirujuk.
Contoh
J. Contoh sederhana
Contoh berikut membuat dan mengisi tabel sederhana dari dua kolom, mencantumkan 3 kabupaten dan warna dalam benderanya. Ini membuat dan mengisi katalog teks lengkap dan indeks pada tabel. Kemudian sintaks CONTAINSTABLE ditunjukkan. Contoh ini menunjukkan bagaimana nilai peringkat tumbuh lebih tinggi ketika nilai pencarian terpenuhi beberapa kali. Dalam kueri terakhir, Tanzania yang berisi hijau dan hitam memiliki peringkat lebih tinggi daripada Italia yang hanya berisi salah satu warna yang dikueri.
CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);
INSERT Flags VALUES ('France', 'Blue and White and Red');
INSERT Flags VALUES ('Italy', 'Green and White and Red');
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');
SELECT * FROM Flags;
GO
CREATE FULLTEXT CATALOG TestFTCat;
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;
GO
SELECT * FROM Flags;
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green') ORDER BY RANK DESC;
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC;
B. Mengembalikan nilai peringkat
Contoh berikut mencari semua nama produk yang berisi kata "frame," "wheel," atau "tire," dan bobot yang berbeda diberikan untuk setiap kata. Untuk setiap baris yang dikembalikan yang cocok dengan kriteria pencarian ini, kedekatan relatif (nilai peringkat) dari kecocokan ditampilkan. Selain itu, baris peringkat tertinggi dikembalikan terlebih dahulu.
USE AdventureWorks2022;
GO
SELECT FT_TBL.Name, KEY_TBL.RANK
FROM Production.Product AS FT_TBL
INNER JOIN CONTAINSTABLE(Production.Product, Name,
'ISABOUT (frame WEIGHT (.8),
wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL
ON FT_TBL.ProductID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
C. Mengembalikan nilai peringkat yang lebih besar dari nilai yang ditentukan
Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru. |
Contoh berikut menggunakan NEAR untuk mencari "bracket
" dan "reflector
" dekat satu sama lain dalam Production.Document
tabel. Hanya baris dengan nilai peringkat 50 atau lebih tinggi yang dikembalikan.
USE AdventureWorks2022
GO
SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable
INNER JOIN CONTAINSTABLE(Production.Document, Document,
'NEAR(bracket, reflector)' ) AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC;
GO
Catatan
Jika kueri teks lengkap tidak menentukan bilangan bulat sebagai jarak maksimum, dokumen yang hanya berisi hit yang kesenjangannya lebih besar dari 100 istilah logis tidak akan memenuhi persyaratan NEAR, dan peringkatnya akan menjadi 0.
D. Mengembalikan 5 hasil peringkat teratas menggunakan top_n_by_rank
Contoh berikut mengembalikan deskripsi 5 produk teratas di mana Description
kolom berisi kata "aluminium" di dekat kata "terang" atau kata "ringan".
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
GO
E. Menentukan argumen BAHASA
Contoh berikut menunjukkan penggunaan LANGUAGE
argumen .
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)',
LANGUAGE N'English',
5
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
Catatan
Argumen LANGUAGE language_term tidak diperlukan untuk menggunakan top_n_by_rank.
Lihat Juga
Batasi Hasil Pencarian dengan RANK
Kueri dengan Pencarian Teks Lengkap
Membuat Kueri Pencarian Teks Lengkap (Alat Database Visual)
CONTAINS (Transact-SQL)
Kueri dengan Pencarian Teks Lengkap
SELECT (Transact-SQL)
FROM (Transact-SQL)