Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery adalah perpustakaan. Kode mencoba mendeteksi dan menangani semua kasus di mana kueri akan menyebabkan SQL Server menghasilkan kesalahan.
Microsoft SQL Server menyediakan fitur pencarian teks lengkap yang kuat. Namun, sintaksnya agak samar, terutama untuk non-pemrogram. Selain itu, ada banyak kondisi yang dapat menyebabkan SQL Server memuntahkan kesalahan jika semuanya tidak benar.
FullTextSearchQuery mengonversi istilah pencarian seperti pengguna yang ramah pengguna ke kondisi SQL Query pencarian teks lengkap yang sesuai. Tujuannya adalah untuk tidak pernah memberikan pengecualian pada input yang terbentuk dengan buruk. Ini hanya membangun kueri valid terbaik yang dapat dari input.
Daftar berikut menunjukkan bagaimana berbagai input diubah.
| Masukan | Keluaran | Keterangan |
|---|---|---|
| ABC | FORMSOF(INFLECTIONAL, abc) | Temukan bentuk infleksional ABC. |
| ~ ABC | FORMSOF(THESAURUS, abc) | Temukan variasi ABC tesaurus. |
| "ABC" | "abc" | Temukan istilah yang tepat ABC. |
| +ABC | "abc" | Temukan istilah yang tepat ABC. |
| "ABC" dekat "def" | "abc" NEAR "def" | Temukan istilah yang tepat ABC dekat istilah pasti def. |
| ABC* | "abc*" | Menemukan kata -kata yang dimulai dengan ABC. |
| -ABC def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | Temukan bentuk infleksional dari DEF tetapi bukan bentuk infleksional ABC. |
| ABC DEF | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | Temukan bentuk infleksional dari ABC dan DEF. |
| ABC atau DEF | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | Temukan bentuk infleksional dari ABC atau DEF. |
| < +ABC +DEF> | "abc" NEAR "def" | Temukan istilah yang tepat ABC dekat istilah pasti def. |
| ABC dan (DEF atau GHI) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | Temukan bentuk infleksional dari ABC dan DEF atau GHI. |
Bahkan setelah kueri yang benar secara sintaksis telah dihasilkan, SQL Server masih dapat menghasilkan kesalahan untuk beberapa kueri. Misalnya, dalam tabel di atas Anda dapat melihat bahwa ouput untuk -abc def menukar dua subspresi. Ini karena NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) akan menyebabkan kesalahan. SQL Server tidak suka NOT di awal. Dalam contoh ini, FullTextSearchQuery akan menukar dua sub -ekspresi (di kedua sisi AND ).
Setelah membangun kueri, FullTextSearchQuery akan memeriksa ini dan beberapa kondisi kesalahan lainnya dan membuat koreksi seperlunya. Tabel berikut menjelaskan kondisi ini.
| Ketentuan | Tindakan diambil |
|---|---|
| Bukan istilah dan term2 | Subekspresi ditukar. |
| Bukan istilah1 | Ekspresi dibuang. |
| Bukan istilah1 dan bukan istilah2 | Ekspresi dibuang jika simpul dikelompokkan (kurung) atau simpul root; Kalau tidak, simpul induk dapat berisi subekspresi lain yang akan membuat yang ini valid. |
| Term1 atau tidak, istilah2 | Ekspresi dibuang. |
| Term1 mendekati bukan istilah2 | Dekat konjungsi berubah menjadi dan. |
FullTextSearchQuery mengkonversi semua konjungsi dekat dan ketika salah satu subekspresi bukanlah internalnode dengan formulir form.literal.
Gunakan metode Transform() untuk mengonversi ekspresi pencarian ke kondisi pencarian teks lengkap SQL Server yang valid. Metode ini mengambil kueri pencarian yang ramah pengguna dan mengubahnya menjadi kondisi pencarian teks lengkap yang dibentuk dengan benar yang dapat diteruskan ke fungsi SQL Server CONTAINS atau CONTAINSTABLE fungsi-fungsi. Jika kueri berisi istilah yang tidak valid, kode akan melakukan apa yang dapat mengembalikan kondisi pencarian yang valid. Jika tidak ada istilah yang valid yang ditemukan, metode ini mengembalikan string kosong.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; Dalam contoh kueri SQL berikut, @SearchTerm adalah referensi ke string yang dikembalikan dari Transform() .
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];Satu hal yang harus diperhatikan adalah penanganan kata -kata berhenti SQL Server. Hentikan kata -kata adalah kata -kata seperti A , dan , dan . Kata-kata ini tidak termasuk dalam indeks teks lengkap. SQL Server tidak mengindeks kata -kata ini karena mereka sangat umum dan tidak menambah kualitas pencarian. Karena kata -kata ini tidak diindeks, SQL Server tidak akan pernah menemukan yang cocok untuk kata -kata ini. Hasilnya adalah bahwa pencarian untuk stop word tidak akan mengembalikan hasil, meskipun kata berhenti itu mungkin muncul dalam artikel!
Cara terbaik untuk menangani hal ini adalah dengan mengecualikan kata -kata ini dari kueri SQL. Pencarian teks lengkap yang mudah memungkinkan Anda melakukan ini dengan menambahkan kata -kata berhenti ke properti Collection StopWords . Kata -kata berhenti tidak akan dimasukkan dalam kueri yang dihasilkan kecuali dikutip, sehingga mencegah kata -kata berhenti dalam permintaan dari memblokir semua hasil.
Cara termudah untuk menambahkan daftar standar stop kata ke koleksi StopWords adalah dengan true ke konstruktor FtsQuery . (Untuk melihat kata -kata mana yang ditambahkan, Anda dapat dengan mudah memeriksa koleksi StopWords .) Anda dapat memodifikasi koleksi StopWords kapan saja, sesuai kebutuhan.
Atau, SQL Server menyediakan opsi untuk mencegah masalah yang dijelaskan di atas. Opsi Transform Noise Words dapat digunakan untuk mengaktifkan SQL Server untuk mengembalikan kecocokan bahkan ketika kueri berisi kata stop (noise word). Atur opsi ini ke 1 untuk mengaktifkan transformasi kata noise. Lihat Opsi Konfigurasi Server Transform Noise Words untuk informasi lebih lanjut.
Kueri berikut ini dapat digunakan untuk mendapatkan kata -kata berhenti sistem dari database SQL Server.
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033Untuk informasi lebih lanjut dan diskusi tentang kode, silakan lihat artikel saya permintaan pencarian teks lengkap mudah.