Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery เป็นไลบรารีคลาส. NET ที่แปลงคำค้นหาที่ใช้งานง่ายให้เป็นแบบสอบถาม Microsoft SQL Server ที่ถูกต้อง รหัสพยายามตรวจจับและจัดการทุกกรณีที่แบบสอบถามจะทำให้ SQL Server สร้างข้อผิดพลาด
Microsoft SQL Server มีคุณสมบัติการค้นหาข้อความเต็มรูปแบบที่ทรงพลัง อย่างไรก็ตามไวยากรณ์ค่อนข้างเป็นความลับโดยเฉพาะอย่างยิ่งสำหรับผู้ที่ไม่ใช่โปรแกรม ยิ่งไปกว่านั้นมีหลายเงื่อนไขที่อาจทำให้ SQL Server ทำให้เกิดข้อผิดพลาดหากสิ่งต่าง ๆ ไม่ถูกต้อง
FullTextSearchQuery แปลงคำค้นหาที่ใช้งานง่ายและใช้งาน Google เป็นเงื่อนไขการค้นหาแบบเต็มข้อความที่สอดคล้องกันที่สอดคล้องกัน เป้าหมายของมันคือการไม่ทิ้งข้อยกเว้นในการป้อนข้อมูลที่ไม่ดี มันสร้างแบบสอบถามที่ถูกต้องที่ดีที่สุดเท่าที่จะทำได้จากอินพุต
รายการต่อไปนี้แสดงให้เห็นว่าอินพุตต่างๆถูกแปลงอย่างไร
| ป้อนข้อมูล | เอาท์พุท | คำอธิบาย |
|---|---|---|
| ABC | FORMSOF(INFLECTIONAL, abc) | ค้นหารูปแบบการผันของ ABC |
| ~ ABC | FORMSOF(THESAURUS, abc) | ค้นหาราพย์ราพย์ของ ABC |
| "ABC" | "abc" | ค้นหาคำที่แน่นอน ABC |
| +ABC | "abc" | ค้นหาคำที่แน่นอน ABC |
| "ABC" ใกล้ "def" | "abc" NEAR "def" | ค้นหาคำที่แน่นอน ABC ใกล้คำศัพท์ที่แน่นอน |
| ABC* | "abc*" | ค้นหาคำที่เริ่มต้นด้วย ABC |
| -ABC def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | ค้นหารูปแบบการติดเชื้อของ def แต่ไม่ใช่รูปแบบการผันของ ABC |
| ABC def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | ค้นหารูปแบบการผันของทั้ง ABC และ Def |
| abc หรือ def | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | ค้นหารูปแบบการติดเชื้อของ ABC หรือ DEF |
| < +abc +def> | "abc" NEAR "def" | ค้นหาคำที่แน่นอน ABC ใกล้คำศัพท์ที่แน่นอน |
| ABC และ (def หรือ ghi) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | ค้นหารูปแบบการผันของทั้ง ABC และ def หรือ ghi |
แม้หลังจากสร้างแบบสอบถามที่ถูกต้องทางวากยสัมพันธ์ SQL Server ยังสามารถสร้างข้อผิดพลาดสำหรับการสืบค้นบางอย่าง ตัวอย่างเช่นในตารางด้านบนคุณจะเห็นว่า ouput สำหรับ -abc def swaps การแสดงออกของสอง subexpressions นี่เป็นเพราะ NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) จะทำให้เกิดข้อผิดพลาด SQL Server ไม่ชอบที่ NOT เริ่มต้น ในตัวอย่างนี้ FullTextSearchQuery จะเปลี่ยนการแสดงออกของย่อยทั้งสอง (ทั้งสองด้านของ AND )
หลังจากสร้างแบบสอบถาม FullTextSearchQuery จะตรวจสอบเงื่อนไขนี้และเงื่อนไขข้อผิดพลาดอื่น ๆ อีกมากมายและทำการแก้ไขตามความจำเป็น ตารางต่อไปนี้อธิบายถึงเงื่อนไขเหล่านี้
| ภาคเรียน | ดำเนินการ |
|---|---|
| ไม่ใช่ term1 และ term2 | Subexpressions Swapped |
| ไม่ใช่ TERM1 | การแสดงออกที่ถูกทิ้ง |
| ไม่ใช่ term1 และไม่ใช่ term2 | นิพจน์ที่ถูกทิ้งหากโหนดถูกจัดกลุ่ม (วงเล็บ) หรือเป็นโหนดรูท มิฉะนั้นโหนดพาเรนต์อาจมีการแสดงออกย่อยอื่นที่จะทำให้หนึ่งนี้ถูกต้อง |
| term1 หรือไม่ term2 | การแสดงออกที่ถูกทิ้ง |
| TERM1 ใกล้ไม่ใช่ TERM2 | ใกล้เคียงเปลี่ยนเป็นและ |
FullTextSearchQuery แปลงทั้งหมดใกล้กับข้อหาเป็นและเมื่อ subexpression ทั้งสองไม่ได้เป็น internalNode ที่มี form termforms.literal
ใช้วิธี Transform() เพื่อแปลงนิพจน์การค้นหาเป็นเงื่อนไขการค้นหาข้อความแบบเต็มข้อความ SQL ที่ถูกต้อง วิธีนี้ใช้คำค้นหาการค้นหาที่ใช้งานง่ายและแปลงเป็นเงื่อนไขการค้นหาข้อความแบบเต็มรูปแบบที่เกิดขึ้นอย่างถูกต้องซึ่งสามารถส่งผ่านไปยัง SQL Server หรือฟังก์ CONTAINS น CONTAINSTABLE หากแบบสอบถามมีข้อกำหนดที่ไม่ถูกต้องรหัสจะทำสิ่งที่สามารถส่งคืนเงื่อนไขการค้นหาที่ถูกต้อง หากไม่พบคำศัพท์ที่ถูกต้องวิธีนี้จะส่งคืนสตริงว่าง
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; ในตัวอย่างการสืบค้น SQL ต่อไปนี้ @SearchTerm เป็นการอ้างอิงถึงสตริงที่ส่งคืนจาก 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];สิ่งหนึ่งที่ต้องระวังคือการจัดการคำหยุดของ SQL Server หยุดคำเป็นคำเช่น A และ และ คำเหล่านี้ไม่รวมอยู่ในดัชนีข้อความเต็ม SQL Server ไม่ได้จัดทำดัชนีคำเหล่านี้เพราะเป็นเรื่องธรรมดามากและไม่ได้เพิ่มคุณภาพของการค้นหา เนื่องจากคำเหล่านี้ไม่ได้รับการจัดทำดัชนี SQL Server จะไม่พบการจับคู่สำหรับคำเหล่านี้ ผลที่ได้คือการค้นหาคำหยุดจะไม่ส่งคืนผลลัพธ์แม้ว่าคำหยุดนั้นอาจปรากฏในบทความ!
วิธีที่ดีที่สุดในการจัดการสิ่งนี้ดูเหมือนว่าจะแยกคำเหล่านี้ออกจากแบบสอบถาม SQL การค้นหาข้อความแบบเต็มง่ายช่วยให้คุณสามารถทำสิ่งนี้ได้โดยการเพิ่มคำหยุดลงในคุณสมบัติการรวบรวม StopWords หยุดคำจะไม่รวมอยู่ในแบบสอบถามที่เกิดขึ้นเว้นแต่ว่าพวกเขาจะถูกยกมาดังนั้นจึงป้องกันการหยุดคำในแบบสอบถามจากการปิดกั้นผลลัพธ์ทั้งหมด
วิธีที่ง่ายที่สุดในการเพิ่มรายการมาตรฐานของคำหยุดลงในคอลเลกชัน StopWords คือการส่งผ่าน true ไปยังตัวสร้าง FtsQuery (เพื่อดูว่าคำใดที่เพิ่มเข้ามาคุณสามารถตรวจสอบคอลเลกชัน StopWords ได้) คุณสามารถแก้ไขคอลเลกชัน StopWords ได้ตลอดเวลาตามต้องการ
อีกทางเลือกหนึ่ง SQL Server มีตัวเลือกสำหรับการป้องกันปัญหาที่อธิบายไว้ข้างต้น ตัวเลือกคำศัพท์การแปลงสัญญาณสามารถใช้เพื่อเปิดใช้งาน SQL Server เพื่อส่งคืนการจับคู่แม้ว่าแบบสอบถามจะมีคำหยุด (คำรบกวน) ตั้งค่าตัวเลือกนี้เป็น 1 เพื่อเปิดใช้งานการแปลงสัญญาณเสียง ดูการแปลงตัวเลือกการกำหนดค่าเซิร์ฟเวอร์คำศัพท์ Noise Words สำหรับข้อมูลเพิ่มเติม
แบบสอบถามต่อไปนี้สามารถใช้เพื่อให้ระบบหยุดคำจากฐานข้อมูล 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 = 1033สำหรับข้อมูลเพิ่มเติมและการอภิปรายเกี่ยวกับรหัสโปรดดูบทความของฉันคำค้นหาการค้นหาข้อความแบบเต็มข้อความง่าย ๆ