Bagikan melalui


BERISI (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 klausul 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 CONTAINS dan menggunakan kondisi pencarian yang sama dengan CONTAINS.

Tidak seperti CONTAINS, namun, kueri 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.

Konvensi sintaks transact-SQL

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

Nama tabel yang telah diindeks teks lengkap. tabel dapat berupa nama objek database satu, dua, tiga, atau empat bagian. Saat Anda 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

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

Bahasa yang sumber dayanya digunakan untuk pemecahan kata, stemming, dan penghapusan tesaurus dan kata kebisingan (atau kata berhenti) 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 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 Anda mengkueri kolom seperti itu, tentukan LANGUAGE <language_term> untuk meningkatkan probabilitas kecocokan yang baik.

Saat ditentukan sebagai string, language_term sesuai dengan alias nilai kolom 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), SQL Server 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.

Keterangan

Predikat teks lengkap dan fungsi bekerja pada satu tabel, yang tersirat dalam FROM predikat. Untuk mencari di beberapa tabel, gunakan tabel yang digabungkan dalam klausul Anda FROM 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 KEY kolom adalah nilai kunci teks lengkap dari baris yang cocok dengan kriteria pilihan yang ditentukan dalam berisi kondisi pencarian. Properti TableFulltextKeyColumn , yang diperoleh dari OBJECTPROPERTYEX fungsi , 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.

Untuk mendapatkan baris yang Anda inginkan dari tabel asli, tentukan gabungan dengan CONTAINSTABLE baris. Bentuk FROM umum klausul untuk pernyataan yang 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 diproduksi dengan 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 SELECT dalam pernyataan:

  • ORDER BY Dalam klausa 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 yang sesuai SELECT pada tabel atau kolom tabel yang dirujuk.

Contoh

J. Contoh dasar

Contoh berikut membuat dan mengisi tabel sederhana dari dua kolom, mencantumkan tiga negara/wilayah dan warna dalam benderanya. Ini membuat dan mengisi katalog teks lengkap dan indeks pada tabel. CONTAINSTABLE Kemudian sintaks 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 yang lebih tinggi daripada Italia yang hanya berisi salah satu warna yang dikueri.

CREATE TABLE Flags
(
    CountryOrRegion NVARCHAR (30) NOT NULL,
    FlagColors VARCHAR (200)
);

CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);

INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO 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, , wheelatau 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 versi yang lebih baru.

Contoh berikut menggunakan NEAR untuk mencari bracket dan reflector berdekatan Production.Document satu sama lain dalam 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 memenuhi NEAR persyaratan, dan peringkatnya adalah 0.

D. Mengembalikan lima hasil peringkat teratas menggunakan top_n_by_rank

Contoh berikut mengembalikan deskripsi lima produk teratas di mana Description kolom berisi kata aluminum 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

E. Tentukan argumen LANGUAGE

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.