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 bernilai rowset CONTAINSTABLE 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 arti, tetapi bukan kata yang tepat, gunakan FREETEXT dan FREETEXTTABLE.

Contoh setiap predikat dan fungsi

Contoh berikut menggunakan database sampel AdventureWorks. Untuk rilis akhir AdventureWorks, lihat Database dan Skrip AdventureWorks untuk SQL Server 2016 CTP3. Untuk menjalankan kueri sampel, Anda juga harus menyiapkan Pencarian Teks Lengkap. Untuk informasi selengkapnya, lihat Mulai Menggunakan Pencarian Teks Lengkap.

Contoh - CONTAINS

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

USE AdventureWorks2022  
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 AdventureWorks2022  
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 kolom Deskripsinya berisi kata "aluminium" di dekat kata "terang" atau kata "ringan." Hanya baris dengan peringkat 2 atau lebih tinggi yang dikembalikan.

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)'  
   ) 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 kueri FREETEXTTABLE untuk mengembalikan baris berpangkat tertinggi terlebih dahulu dan untuk menambahkan peringkat setiap baris ke daftar pemilihan. Untuk menulis kueri serupa, Anda harus tahu bahwa ProductDescriptionID adalah kolom kunci unik untuk tabel ProductDescription .

USE AdventureWorks2022  
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 AdventureWorks2022  
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/CONTAINSTABLE dan FREETEXT/FREETEXTTABLE berguna untuk berbagai jenis pencocokan. Info berikut membantu Anda memilih predikat atau fungsi terbaik untuk kueri Anda:

CONTAINS/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/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/FREETEXT dan fungsi CONTAINSTABLE/FREETEXTTABLE bernilai set baris memiliki sintaks dan opsi yang berbeda. Info 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 lengkap. Baris yang cocok dikembalikan dalam tataan 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 pemecahan kata dan stemming, pencarian tesaurus, dan penghapusan kata kebisingan.

Anda dapat menggunakan nama empat bagian dalam predikat CONTAINS atau FREETEXT untuk mengkueri kolom terindeks teks lengkap dari 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.

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

Fungsi bernilai rowset CONTAINSTABLE dan FREETEXTTABLE

Penggunaan. Gunakan fungsi teks lengkap fungsi 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 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 memberlakukan 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 dikembalikan, sebagai berikut:

  • Kolom KUNCI . Kolom KEY mengembalikan nilai unik dari baris yang dikembalikan. Kolom KEY dapat digunakan untuk menentukan kriteria pilihan.
  • Kolom RANK . Kolom RANK mengembalikan nilai 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 top_n_by_rank opsional. Untuk informasi selengkapnya, lihat Membatasi Hasil Pencarian dengan RANK.

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

Jenis pencarian tertentu

Mencari kata atau frasa tertentu (Istilah Sederhana)

Anda dapat menggunakan CONTAINS, CONTAINSTABLE, FREETEXT, atau FREETEXTTABLE untuk mencari tabel untuk kata atau frasa tertentu. Misalnya, jika Anda ingin mencari tabel ProductReview dalam AdventureWorks2022 database untuk menemukan semua komentar tentang produk dengan frasa "kurva pembelajaran," Anda dapat menggunakan predikat CONTAINS sebagai berikut:

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

Kondisi pencarian, dalam hal ini "kurva pembelajaran," dapat menjadi kompleks dan dapat terdiri dari satu atau beberapa istilah.

Info selengkapnya tentang pencarian 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" adalah frasa. Kata-kata dan frasa seperti ini disebut istilah sederhana.

CONTAINS dan CONTAINSTABLE mencari kecocokan yang tepat untuk frasa. FREETEXT dan FREETEXTTABLE memecah frasa menjadi kata terpisah.

Mencari kata dengan awalan (Istilah Awalan)

Anda dapat menggunakan CONTAINS atau CONTAINSTABLE untuk mencari kata atau frasa dengan awalan yang ditentukan. 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 top``ple, top``ping, dan top. Kueri terlihat seperti contoh berikut:

USE AdventureWorks2022  
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 kartubebas..

Ketika istilah awalan adalah frasa, setiap token yang membentuk frasa dianggap sebagai istilah awalan terpisah. Semua baris yang memiliki kata yang dimulai dengan istilah awalan akan dikembalikan. Misalnya, istilah awalan "roti ringan*" akan menemukan baris dengan teks "roti ringan," "roti ringan," atau "roti ringan," tetapi tidak akan mengembalikan "roti panggang ringan."

Info selengkapnya tentang pencarian awalan

Istilah awalan mengacu pada untai (karakter) yang ditempeli ke bagian depan kata untuk menghasilkan kata turunan atau bentuk yang tidak difungsikan.

  • Untuk istilah awalan tunggal, kata apa pun yang dimulai dengan istilah yang ditentukan akan menjadi bagian dari kumpulan hasil. Misalnya, istilah "auto*" cocok dengan "otomatis," "mobil," dan sebagainya.

  • Untuk frasa, setiap kata dalam frasa dianggap sebagai istilah awalan. Misalnya, istilah "auto tran*" cocok dengan "transmisi otomatis" dan "transduser mobil," tetapi tidak cocok dengan "transmisi motor otomatis."

Pencarian awalan didukung oleh CONTAINS dan CONTAINSTABLE.

Mencari bentuk infleksi dari kata tertentu (Istilah Pembuatan)

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

Contoh berikut mencari segala bentuk "kaki" ("kaki," "kaki," dan sebagainya) di Comments kolom ProductReview tabel dalam AdventureWorks database:

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

Pencarian teks lengkap menggunakan stemmer, yang memungkinkan Anda mencari berbagai tegangan dan konjugasi kata kerja, atau bentuk tunggal dan jamak dari kata benda. Untuk informasi selengkapnya tentang stemmer, lihat Mengonfigurasi dan Mengelola Word Breaker dan Stemmers untuk Pencarian.

Info selengkapnya tentang pencarian istilah pembuatan

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

Misalnya, cari bentuk infleksi kata "drive." Jika berbagai baris dalam tabel menyertakan kata "drive," "drive," "drove," "driving," dan "driven," semua akan berada dalam tataan hasil karena masing-masing dapat dihasilkan secara infleksi dari drive kata.

FREETEXT dan FREETEXTTABLE mencari 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 Pencarian Teks Lengkap.

Misalnya, jika entri, "{mobil, mobil, truk, van}," ditambahkan ke tesaurus, Anda dapat mencari bentuk tesaurus dari kata "mobil." Semua baris dalam tabel yang dikueri yang menyertakan kata "mobil," "truk," "van," atau "mobil," muncul dalam tataan hasil karena masing-masing kata ini termasuk dalam set ekspansi sinonim yang berisi kata "mobil."

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

Mencari kata MENDEKATI 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 "es" berada di dekat kata "hoki" atau di mana frasa "ice skating" berada di dekat frasa "hoki es."

CONTAINS dan CONTAINSTABLE

Untuk informasi selengkapnya tentang pencarian kedekatan, lihat Mencari Kata Yang Dekat dengan Kata Lain dengan NEAR.

Mencari 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, di mana teks apa pun yang dimulai dengan string "Bay" memiliki "Street" atau "View." Hasilnya memberikan peringkat yang lebih tinggi pada baris yang berisi lebih banyak kata yang ditentukan.

USE AdventureWorks2022  
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 bersama dengan istilah sederhana, istilah awalan, istilah pembuatan, atau istilah kedekatan.

Informasi selengkapnya tentang pencarian 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 antaranya); namun, beberapa hasil akan dianggap lebih relevan daripada yang lain karena variasi dalam nilai tertimbang yang terkait dengan istilah yang dicari yang berbeda.

Pencarian istilah tertimbang didukung oleh CONTAINSTABLE.

Gunakan AND, OR, dan NOT (operator Boolean)

Predikat CONTAINS dan fungsi CONTAINSTABLE menggunakan kondisi pencarian yang sama. Keduanya mendukung menggabungkan 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 "latte" dan "Bagel bergaya New York." Anda dapat menggunakan AND NOT, misalnya, untuk menemukan baris yang berisi "bagel" tetapi tidak berisi "keju krim."

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

Untuk informasi tentang menggabungkan CONTAINS dengan predikat lain yang menggunakan operator logis AND, OR, dan NOT, lihat Kondisi Pencarian (Transact-SQL).

Contoh

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

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

Kasus, stopword, bahasa, dan thesaurus

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 ketidakpekaan huruf besar/kecil (misalnya, kana = ketidakpekaan). Jenis normalisasi ortografis ini tidak didukung.

  • Stopwords. Saat mendefinisikan kueri teks lengkap, Mesin Teks-Penuh membuang teka-teki berhenti (juga disebut kata kebisingan) dari kriteria pencarian. Stopwords adalah kata-kata seperti "a," "dan," "is," atau "the," yang dapat sering terjadi tetapi biasanya tidak membantu saat mencari teks tertentu. Stopwords tercantum dalam daftar berhenti. Setiap indeks teks lengkap dikaitkan dengan daftar henti tertentu, yang menentukan teka-teki berhenti apa yang dihilangkan dari kueri atau indeks pada waktu pengindeksan. Untuk informasi selengkapnya, lihat Mengonfigurasi dan Mengelola Stopwords dan Stoplists untuk Pencarian Teks Lengkap.

  • Bahasa, dengan opsi BAHASA . Banyak istilah kueri sangat bergantung pada perilaku pemecah kata. Untuk memastikan bahwa Anda menggunakan pemecah kata yang benar (dan stemmer) dan file tesaurus, kami sarankan Anda menentukan opsi BAHASA. Untuk informasi selengkapnya, lihat Memilih Bahasa Saat Membuat Indeks Teks Lengkap.

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

Periksa hasil tokenisasi

Setelah Anda menerapkan pemecah kata, tesaurus, dan kombinasi daftar berhenti tertentu dalam kueri, Anda bisa melihat bagaimana Pencarian Teks-Penuh mentokenisasi hasil dengan menggunakan tampilan manajemen dinamis sys.dm_fts_parser . Untuk informasi selengkapnya, lihat sys.dm_fts_parser (Transact-SQL).

Lihat Juga

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (T-SQL)
FREETEXTTABLE (Transact-SQL)
Membuat Kueri Pencarian Teks Lengkap (Alat Database Visual)
Meningkatkan Performa Kueri Teks Lengkap