Kueri dengan Pencarian Teks Lengkap

Berlaku untuk: SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Tulis kueri teks lengkap dengan menggunakan predikat CONTAINS dan FREETEXT dan fungsi CONTAINSTABLE bernilai kumpulan baris dan FREETEXTTABLE dengan pernyataan SELECT . Artikel ini menyediakan contoh setiap predikat dan fungsi dan membantu Anda memilih yang terbaik untuk digunakan.

  • Untuk mencocokkan kata dan frasa, gunakan CONTAINS dan CONTAINSTABLE.
  • Untuk mencocokkan artinya, tetapi bukan kata-kata yang tepat, gunakan FREETEXT dan FREETEXTTABLE.

Contoh setiap predikat dan fungsi

Contoh kode dalam artikel ini menggunakan database sampel AdventureWorks2025, AdventureWorksDW2025, atau AdventureWorksLT2025, yang dapat Anda unduh dari repositori GitHub Azure Data SQL Samples Repository.

Untuk menjalankan kueri sampel, Anda juga harus menyiapkan Pencarian Teks Lengkap. Untuk informasi selengkapnya, lihat Memulai Pencarian Full-Text.

Contoh: MENGANDUNG

Contoh berikut menemukan semua produk dengan harga $80.99 yang berisi kata Mountain:

USE AdventureWorks2025;
GO

SELECT Name,
       ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
      AND CONTAINS ((Name), 'Mountain');
GO

Contoh: FREETEXT

Contoh berikut mencari semua dokumen yang berisi kata-kata yang terkait dengan vital safety components:

USE AdventureWorks2025;
GO

SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO

Contoh: CONTAINSTABLE

Contoh berikut mengembalikan ID deskripsi dan deskripsi semua produk yang kolomnya Description berisi kata aluminum di dekat kata light atau kata lightweight. Hanya baris dengan peringkat lebih tinggi dari 2 yang dikembalikan.

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)') AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

Contoh: FREETEXTTABLE

Contoh berikut memperluas FREETEXTTABLE kueri untuk mengembalikan baris peringkat tertinggi terlebih dahulu dan untuk menambahkan peringkat setiap baris ke daftar pilih. Untuk menulis kueri serupa, Anda harus tahu bahwa itu ProductDescriptionID adalah kolom kunci unik untuk ProductDescription tabel.

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Berikut adalah ekstensi kueri yang sama yang hanya mengembalikan baris dengan peringkat 10 atau lebih besar:

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Mencocokkan kata atau mencocokkan arti

CONTAINS dan CONTAINSTABLE, atau FREETEXT dan FREETEXTTABLE, berguna untuk berbagai jenis pencocokan. Informasi berikut membantu Anda memilih predikat atau fungsi terbaik untuk kueri Anda:

CONTAINS dan CONTAINSTABLE

  • Cocokkan kata dan frasa tunggal dengan pencocokan yang tepat atau kabur (kurang tepat).
  • Anda juga dapat melakukan hal-hal berikut:
    • Tentukan kedekatan kata dalam jarak tertentu satu sama lain.
    • Mengembalikan kecocokan tertimbang.
    • Gabungkan kondisi pencarian dengan operator logis. Untuk informasi selengkapnya, lihat Menggunakan operator Boolean (AND, OR, dan NOT) nanti di artikel ini.

FREETEXT dan FREETEXTTABLE

  • Cocokkan arti, tetapi bukan kata yang tepat, dari kata, frasa, atau kalimat tertentu ( string teks bebas).
  • Kecocokan dihasilkan jika ada istilah atau bentuk istilah apa pun yang ditemukan dalam indeks teks lengkap kolom tertentu.

Membandingkan predikat dan fungsi

Predikat CONTAINS atau FREETEXT dan fungsi bernilai rowset CONTAINSTABLE atau FREETEXTTABLE memiliki sintaks dan opsi yang berbeda. Informasi berikut membantu Anda memilih predikat atau fungsi terbaik untuk kueri Anda:

Predikat CONTAINS dan FREETEXT

Penggunaan. Gunakan predikat teks lengkap CONTAINS dan FREETEXT dalam klausa WHERE atau HAVING dari pernyataan SELECT.

Hasil. Predikat CONTAINS dan FREETEXT mengembalikan nilai TRUE atau FALSE yang menunjukkan apakah baris tertentu cocok dengan kueri teks penuh. Baris yang cocok dikembalikan dalam kumpulan hasil.

Opsi lainnya. Anda dapat menggabungkan predikat dengan predikat Transact-SQL lainnya, seperti LIKE dan BETWEEN.

Anda dapat menentukan satu kolom, daftar kolom, atau semua kolom dalam tabel yang akan dicari.

Secara opsional, Anda dapat menentukan bahasa yang sumber dayanya digunakan oleh kueri teks lengkap untuk pemenggalan kata dan stemming, pencarian tesaurus, dan penghapusan kata yang tidak berguna.

Anda dapat menggunakan nama empat bagian dalam predikat CONTAINS atau FREETEXT untuk membuat kueri pada kolom yang diindeks teks lengkap pada tabel target di server tertaut. Untuk menyiapkan server jarak jauh untuk menerima kueri teks lengkap, buat indeks teks lengkap pada tabel dan kolom target di server jarak jauh lalu tambahkan server jarak jauh sebagai server tertaut.

Untuk informasi selengkapnya tentang sintaks dan argumen predikat ini, lihat CONTAINS dan FREETEXT.

Fungsi CONTAINSTABLE dan FREETEXTTABLE yang bernilai rowset

Penggunaan. Gunakan fungsi full-text CONTAINSTABLE dan FREETEXTTABLE seperti nama tabel biasa dalam klausa FROM dari pernyataan SELECT.

Anda harus menentukan tabel dasar untuk dicari saat menggunakan salah satu fungsi ini. Seperti halnya predikat, Anda dapat menentukan satu kolom, daftar kolom, atau semua kolom dalam tabel yang akan dicari, dan secara opsional, bahasa yang sumber dayanya digunakan oleh kueri teks lengkap yang diberikan.

Biasanya, Anda harus menggabungkan hasil dari CONTAINSTABLE atau FREETEXTTABLE dengan tabel dasar. Untuk menggabungkan tabel, Anda harus mengetahui nama kolom kunci unik. Kolom ini, yang terjadi di setiap tabel yang diaktifkan teks lengkap, digunakan untuk menerapkan baris unik untuk tabel ( kolom kunci unik). Untuk informasi selengkapnya tentang kolom kunci, lihat Membuat dan mengelola indeks teks lengkap.

Hasil. Fungsi-fungsi ini mengembalikan tabel nol, satu, atau beberapa baris yang cocok dengan kueri teks lengkap. Tabel yang dikembalikan hanya berisi baris dari tabel dasar yang cocok dengan kriteria pilihan yang ditentukan dalam kondisi pencarian teks lengkap fungsi.

Kueri yang menggunakan salah satu fungsi ini juga mengembalikan nilai peringkat relevansi (RANK) dan kunci teks lengkap (KEY) untuk setiap baris yang ditampilkan, sebagai berikut:

  • KEY kolom. Kolom KEY mengembalikan nilai unik dari baris yang dikembalikan. Kolom KEY dapat digunakan untuk menentukan kriteria seleksi.

  • RANK kolom. Kolom mengembalikan RANKnilai peringkat untuk setiap baris yang menunjukkan seberapa baik baris cocok dengan kriteria pilihan. Semakin tinggi nilai peringkat teks atau dokumen dalam baris, semakin relevan baris tersebut untuk kueri teks lengkap yang diberikan. Baris yang berbeda dapat diberi peringkat secara identik. Anda dapat membatasi jumlah kecocokan yang akan dikembalikan dengan menentukan parameter opsional top_n_by_rank. Untuk informasi selengkapnya, lihat Membatasi hasil pencarian dengan peringkat.

Untuk informasi selengkapnya tentang sintaks dan argumen fungsi ini, lihat CONTAINSTABLE dan FREETEXTTABLE.

Jenis pencarian tertentu

Cari kata atau frasa tertentu (istilah sederhana)

Anda dapat menggunakan CONTAINS, CONTAINSTABLE, , FREETEXTatau FREETEXTTABLE untuk mencari tabel untuk kata atau frasa tertentu. Misalnya, jika Anda ingin mencari ProductReview tabel dalam AdventureWorks2025 database untuk menemukan semua komentar tentang produk dengan frasa learning curve, Anda dapat menggunakan CONTAINS predikat sebagai berikut:

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

Kondisi pencarian, dalam hal learning curveini , bisa rumit dan dapat terdiri dari satu atau lebih istilah.

Informasi selengkapnya tentang penelusuran istilah sederhana

Dalam pencarian teks lengkap, kata (atau token) adalah string yang batasnya diidentifikasi oleh pemecah kata yang sesuai, mengikuti aturan linguistik bahasa yang ditentukan. Frasa yang valid terdiri dari beberapa kata, dengan atau tanpa tanda baca di antaranya.

Misalnya, croissant adalah kata, dan café au lait merupakan frasa. Kata dan frasa seperti ini disebut istilah sederhana.

CONTAINS CONTAINSTABLE dan cari kecocokan yang tepat untuk frasa tersebut. FREETEXT FREETEXTTABLE dan pecahkan frasa menjadi kata-kata terpisah.

Cari kata berdasarkan prefiks (istilah prefiks)

Anda dapat menggunakan CONTAINS atau CONTAINSTABLE mencari kata atau frasa dengan awalan tertentu. Semua entri dalam kolom yang berisi teks yang dimulai dengan awalan yang ditentukan dikembalikan. Misalnya, untuk mencari semua baris yang berisi awalan top-, seperti dalam topple, topping, dan top, kueri terlihat seperti contoh berikut:

USE AdventureWorks2025;
GO

SELECT Description,
       ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO

Semua teks yang cocok dengan teks yang ditentukan sebelum tanda bintang (*) dikembalikan. Jika teks dan tanda bintang tidak dibatasi oleh tanda kutip ganda, seperti dalam CONTAINS (DESCRIPTION, 'top*'), pencarian teks lengkap tidak menganggap tanda bintang sebagai karakter pengganti.

Ketika istilah awalan adalah frasa, setiap token yang membentuk frasa dianggap sebagai istilah awalan terpisah. Semua baris yang memiliki kata yang diawali dengan istilah awalan akan ditampilkan. Misalnya, istilah awalan light bread* menemukan baris yang berisi teks light breaded, lightly breaded, atau light bread, tetapi tidak mengembalikan lightly toasted bread.

Informasi selengkapnya tentang penelusuran awalan

Istilah awalan mengacu pada rangkaian karakter yang ditempatkan di depan kata untuk menghasilkan kata turunan atau bentuk yang terinfleksi.

  • Untuk satu istilah awalan, kata apa pun yang dimulai dengan istilah yang ditentukan adalah bagian dari kumpulan hasil. Misalnya, istilah auto* cocok automatic, automobile, dan sebagainya.

  • Untuk frasa, setiap kata dalam frasa dianggap sebagai istilah awalan. Misalnya, istilah auto tran* cocok dengan automatic transmission dan automobile transducer, tetapi tidak cocok dengan automatic motor transmission.

Pencarian awalan didukung oleh CONTAINS dan CONTAINSTABLE.

Cari bentuk infleksi dari kata tertentu (istilah generasi)

Anda dapat menggunakan CONTAINS, CONTAINSTABLE, , FREETEXTatau FREETEXTTABLE untuk mencari semua bentuk dan konjugasi yang berbeda dari kata kerja atau bentuk tunggal dan jamak dari kata benda (pencarian infleksi) atau untuk bentuk sinonim dari kata tertentu (pencarian tesaurus).

Contoh berikut mencari segala bentuk foot (foot, feet, dan seterusnya) di Comments kolom ProductReview tabel dalam AdventureWorks2025 database:

USE AdventureWorks2025;
GO

SELECT Comments,
       ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO

Pencarian teks lengkap menggunakan stemmer, yang memungkinkan Anda mencari bentuk waktu dan konjugasi dari sebuah kata kerja, baik bentuk tunggal maupun jamak dari sebuah kata benda. Untuk informasi selengkapnya tentang stemmer, lihat Mengonfigurasi dan mengelola pemecah kata dan stemmer.

Informasi selengkapnya tentang penelusuran istilah generasi

Bentuk infleksi adalah bentuk-bentuk dan konjugasi kata kerja yang berbeda atau bentuk tunggal dan jamak dari kata benda.

Misalnya, cari bentuk infleksi dari kata drive. Jika beberapa baris dalam tabel menyertakan kata drive, drives, drove, driving, dan driven, semuanya akan termasuk dalam kumpulan hasil karena masing-masing dapat dibentuk secara infleksional dari kata drive.

FREETEXT dan FREETEXTTABLE cari istilah infleksi dari semua kata yang ditentukan secara default. CONTAINS dan CONTAINSTABLE mendukung argumen opsional INFLECTIONAL .

Mencari sinonim dari kata tertentu

Thesaurus mendefinisikan sinonim yang ditentukan pengguna untuk istilah. Untuk informasi selengkapnya tentang file tesaurus, lihat Mengonfigurasi dan Mengelola File Tesaurus untuk Full-Text Penelusuran.

Misalnya, jika entri, {car, automobile, truck, van}, ditambahkan ke tesaurus, Anda dapat mencari bentuk tesaurus dari kata car. Semua baris dalam tabel yang dikueri yang menyertakan kata automobile, truck, van, atau car muncul dalam kumpulan hasil karena masing-masing kata ini termasuk dalam kumpulan ekspansi sinonim yang berisi kata car.

FREETEXT FREETEXTTABLE dan gunakan tesaurus secara default. CONTAINS dan CONTAINSTABLE mendukung argumen opsional THESAURUS .

Mencari kata yang berdekatan dengan kata lain

Istilah kedekatan menunjukkan kata atau frasa yang dekat satu sama lain. Anda juga dapat menentukan jumlah maksimum istilah non-pencarian yang memisahkan istilah pencarian pertama dan terakhir. Selain itu, Anda dapat mencari kata atau frasa dalam urutan apa pun, atau dalam urutan yang Anda tentukan.

Misalnya, Anda ingin menemukan baris di mana kata ice berada di dekat kata atau di mana frasa hockey berada di dekat frasa ice skatingice hockey.

Untuk informasi selengkapnya tentang pencarian kedekatan, lihat Mencari Kata yang Berdekatan dengan Kata Lain dengan NEAR.

Menelusuri kata atau frasa menggunakan nilai tertimbang (istilah tertimbang)

Anda dapat menggunakan CONTAINSTABLE untuk mencari kata atau frasa dan menentukan nilai pembobotan. Berat, diukur sebagai angka dari 0,0 hingga 1,0, menunjukkan pentingnya setiap kata dan frasa dalam satu set kata dan frasa. Berat 0,0 adalah yang terendah, dan berat 1,0 adalah yang tertinggi.

Contoh berikut menunjukkan kueri yang mencari semua alamat pelanggan, menggunakan bobot, yang di dalamnya teks apa pun yang diawali dengan string Bay memiliki Street atau View. Hasilnya memberikan peringkat yang lebih tinggi untuk baris yang berisi lebih banyak kata yang ditentukan.

USE AdventureWorks2025;
GO

SELECT AddressLine1,
       KEY_TBL.RANK
FROM Person.Address AS Address
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
         Street WEIGHT(0.9),
         View WEIGHT(0.1)
         ) ') AS KEY_TBL
     ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Istilah tertimbang dapat digunakan bersamaan dengan istilah sederhana, istilah awalan, istilah generasi, atau istilah kedekatan.

Informasi lebih lanjut tentang penelusuran istilah tertimbang

Dalam pencarian istilah tertimbang, nilai pembobotan menunjukkan tingkat kepentingan untuk setiap kata dan frasa dalam satu set kata dan frasa. Nilai berat 0,0 adalah yang terendah, dan nilai berat 1,0 adalah yang tertinggi.

Misalnya, dalam kueri yang mencari beberapa istilah, Anda dapat menetapkan setiap kata pencarian nilai bobot yang menunjukkan pentingnya relatif terhadap kata lain dalam kondisi pencarian. Hasil untuk jenis kueri ini mengembalikan baris yang paling relevan terlebih dahulu, sesuai dengan bobot relatif yang telah Anda tetapkan untuk mencari kata. Kumpulan hasil berisi dokumen atau baris yang berisi salah satu istilah yang ditentukan (atau konten di antara keduanya); namun, beberapa hasil dianggap lebih relevan daripada yang lain karena variasi nilai tertimbang yang terkait dengan istilah pencarian yang berbeda.

Pencarian istilah tertimbang didukung oleh CONTAINSTABLE.

Gunakan AND, OR, dan NOT (operator Boolean)

CONTAINS predikat dan CONTAINSTABLE fungsi menggunakan kondisi pencarian yang sama. Keduanya mendukung penggabungan beberapa istilah pencarian dengan menggunakan operator Boolean (AND, OR, dan NOT) untuk melakukan operasi logis. Anda dapat menggunakan AND, misalnya, untuk menemukan baris yang berisi keduanya latte dan New York-style bagel. Anda dapat menggunakan AND NOT, misalnya, untuk menemukan baris yang berisi bagel tetapi tidak berisi cream cheese.

Sebaliknya, FREETEXT dan FREETEXTTABLE memperlakukan istilah Boolean sebagai kata-kata yang harus dicari.

Untuk informasi tentang menggabungkan CONTAINS dengan predikat lain yang menggunakan operator ANDlogis , OR, dan NOT, lihat Kondisi pencarian.

Contoh

Contoh berikut menggunakan CONTAINS predikat untuk mencari deskripsi di mana ID deskripsi tidak sama dengan 5 dan deskripsi berisi kata Aluminum dan kata spindle. Kondisi pencarian menggunakan AND operator Boolean. Contoh ini menggunakan tabel ProductDescription dari database AdventureWorks2025.

USE AdventureWorks2025;
GO

SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5
      AND CONTAINS ((Description), 'aluminum AND spindle');
GO

Kasus, stopword, bahasa, dan tesaurus

Saat menulis kueri teks lengkap, Anda juga dapat menentukan opsi berikut:

  • Sensitivitas kasus. Kueri pencarian teks lengkap tidak peka huruf besar/kecil. Namun, dalam bahasa Jepang, ada beberapa ortografi fonetik di mana konsep normalisasi ortografi mirip dengan insensitivitas terhadap huruf kapital (misalnya, kana = insensitivitas). Jenis normalisasi ortografi ini tidak didukung.

  • Stopwords. Saat Anda menentukan kueri teks lengkap, Full-Text Engine akan membuang kata henti (juga disebut kata noise) dari kriteria pencarian. Kata henti adalah kata-kata seperti a, and, is, atau the, yang dapat sering muncul tetapi biasanya tidak membantu saat mencari teks tertentu. Stopwords tercantum dalam daftar stoplist. Setiap indeks teks lengkap dikaitkan dengan daftar berhenti tertentu, yang menentukan kata berhenti apa yang dihilangkan dari kueri atau indeks pada saat pengindeksan. Untuk informasi selengkapnya, lihat Mengonfigurasi dan mengelola stopword dan daftar stopword untuk Pencarian Teks Lengkap.

  • Bahasa, dengan LANGUAGE opsi . Banyak istilah kueri sangat bergantung pada perilaku pemecah kata. Untuk memastikan Anda menggunakan pemecah kata (dan stemmer) serta berkas tesaurus yang benar, Anda harus menentukan opsi LANGUAGE. Untuk informasi selengkapnya, lihat Memilih bahasa saat membuat indeks teks lengkap.

  • Thesaurus. kueri FREETEXT dan FREETEXTTABLE menggunakan tesaurus secara bawaan. CONTAINS dan CONTAINSTABLE mendukung argumen opsional THESAURUS . Untuk informasi selengkapnya, lihat Mengonfigurasi dan Mengelola File Tesaurus untuk Pencarian Teks Lengkap.

Periksa hasil tokenisasi

Setelah Anda menerapkan kombinasi pemecah kata, tesaurus, dan daftar kata henti tertentu dalam kueri, Anda dapat melihat bagaimana Pencarian Teks Lengkap memecah hasil menjadi token dengan menggunakan tampilan manajemen dinamis sys.dm_fts_parser. Untuk informasi selengkapnya, lihat sys.dm_fts_parser.