ฉันเพิ่งอ่านโพสต์ที่กล่าวถึง "การค้นหาข้อความแบบเต็ม" ใน SQL
ฉันแค่สงสัยว่าความแตกต่างระหว่าง FTS และ LIKE คืออะไร ฉันอ่านบทความสองสามบทความ แต่ไม่พบสิ่งใดที่อธิบายได้ดี
ฉันเพิ่งอ่านโพสต์ที่กล่าวถึง "การค้นหาข้อความแบบเต็ม" ใน SQL
ฉันแค่สงสัยว่าความแตกต่างระหว่าง FTS และ LIKE คืออะไร ฉันอ่านบทความสองสามบทความ แต่ไม่พบสิ่งใดที่อธิบายได้ดี
คำตอบ:
โดยทั่วไปมีการแลกเปลี่ยนระหว่าง "ความแม่นยำ" และ "การเรียกคืน" ความแม่นยำสูงหมายความว่าจะมีการนำเสนอผลลัพธ์ที่ไม่เกี่ยวข้องน้อยลง (ไม่มีผลบวกที่ผิดพลาด) ในขณะที่การเรียกคืนสูงหมายความว่าผลลัพธ์ที่เกี่ยวข้องน้อยลงจะหายไป (ไม่มีผลลบเท็จ) การใช้ตัวดำเนินการ LIKE ช่วยให้คุณมีความแม่นยำ 100% โดยไม่มีข้อยกเว้นในการเรียกคืน สิ่งอำนวยความสะดวกในการค้นหาข้อความแบบเต็มช่วยให้คุณมีความยืดหยุ่นอย่างมากในการปรับแต่งความแม่นยำเพื่อให้จำได้ดีขึ้น
การใช้งานการค้นหาข้อความแบบเต็มส่วนใหญ่ใช้ "ดัชนีกลับด้าน" นี่คือดัชนีที่คีย์เป็นคำแต่ละคำและค่าที่เกี่ยวข้องคือชุดของระเบียนที่มีคำ การค้นหาข้อความแบบเต็มได้รับการปรับให้เหมาะสมเพื่อคำนวณจุดตัดการรวมกันและอื่น ๆ ของชุดระเบียนเหล่านี้และโดยปกติจะมีอัลกอริทึมการจัดอันดับเพื่อหาจำนวนว่าระเบียนที่ระบุนั้นตรงกับคำค้นหามากเพียงใด
ตัวดำเนินการ SQL LIKE อาจไม่มีประสิทธิภาพอย่างมาก หากคุณใช้กับคอลัมน์ที่ไม่ได้จัดทำดัชนีระบบจะใช้การสแกนแบบเต็มเพื่อค้นหารายการที่ตรงกัน (เช่นเดียวกับแบบสอบถามใด ๆ ในช่องที่ไม่ได้จัดทำดัชนี) หากคอลัมน์ถูกจัดทำดัชนีการจับคู่สามารถดำเนินการกับคีย์ดัชนีได้ แต่มีประสิทธิภาพน้อยกว่าการค้นหาดัชนีส่วนใหญ่มาก ในกรณีที่เลวร้ายที่สุดรูปแบบ LIKE จะมีสัญลักษณ์แทนชั้นนำที่ต้องตรวจสอบทุกคีย์ดัชนี ในทางตรงกันข้ามระบบการดึงข้อมูลจำนวนมากสามารถเปิดใช้งานการสนับสนุนสำหรับอักขระตัวแทนชั้นนำโดยการคอมไพล์ต้นไม้ต่อท้ายในฟิลด์ที่เลือก
คุณสมบัติอื่น ๆ โดยทั่วไปของการค้นหาข้อความแบบเต็ม ได้แก่
FTS เกี่ยวข้องกับการจัดทำดัชนีคำแต่ละคำภายในช่องข้อความเพื่อให้การค้นหาผ่านบันทึกจำนวนมากเป็นไปอย่างรวดเร็ว การใช้ LIKE ยังคงต้องการให้คุณค้นหาสตริง (เชิงเส้นหรือสิ่งที่คล้ายกัน) ภายในฟิลด์
MySQL สร้างดัชนีจากคำของคอลัมน์การค้นหาข้อความเต็มที่เปิดใช้งานและทำการค้นหาในดัชนีนี้ MySQL ใช้อัลกอริทึมที่ซับซ้อนเพื่อกำหนดแถวที่ตรงกับคำค้นหา
นอกจากนี้จากคำตอบ SO นี้ :
การค้นหาข้อความแบบเต็มมีข้อดีบางประการ
การจัดทำดัชนี:
สิ่งที่ต้องการ:
WHERE Foo LIKE '%Bar';
ไม่สามารถใช้ประโยชน์จากดัชนี จะต้องดูทุกแถวและดูว่าตรงกันหรือไม่ อย่างไรก็ตามดัชนีแบบเต็มสามารถทำได้ ในความเป็นจริงดัชนีแบบเต็มสามารถให้ความยืดหยุ่นมากขึ้นในแง่ของลำดับของคำที่ตรงกันคำเหล่านั้นอยู่ใกล้กันเพียงใด ฯลฯ
ต้นกำเนิด:
การค้นหาแบบเต็มข้อความสามารถทำให้เกิดคำได้ หากคุณค้นหาคำว่า run คุณจะได้รับผลลัพธ์สำหรับ "ran" หรือ "running" เอ็นจิ้นฟูลเท็กซ์ส่วนใหญ่มีพจนานุกรมต้นกำเนิดในหลายภาษา
ผลลัพธ์ถ่วงน้ำหนัก:
ดัชนีแบบเต็มสามารถครอบคลุมหลายคอลัมน์ ตัวอย่างเช่นคุณสามารถค้นหา "พายลูกพีช" และดัชนีอาจมีชื่อคำหลักและเนื้อหา ผลลัพธ์ที่ตรงกับชื่อสามารถถ่วงน้ำหนักให้สูงขึ้นตามความเกี่ยวข้องมากขึ้นและสามารถจัดเรียงให้แสดงใกล้ด้านบน
ข้อเสีย:
ดัชนีเต็มรูปแบบอาจมีขนาดใหญ่กว่าดัชนี B-TREE มาตรฐานหลายเท่า ด้วยเหตุนี้ผู้ให้บริการโฮสต์หลายรายที่เสนออินสแตนซ์ฐานข้อมูลจึงปิดใช้งานคุณสมบัตินี้หรืออย่างน้อยก็คิดค่าบริการเพิ่มเติม ตัวอย่างเช่นล่าสุดที่ฉันตรวจสอบ Windows Azure ไม่รองรับการสืบค้นแบบเต็มข้อความ
ดัชนีแบบเต็มอาจอัปเดตได้ช้าลง หากข้อมูลเปลี่ยนแปลงมากอาจมีความล่าช้าในการอัปเดตดัชนีเมื่อเทียบกับดัชนีมาตรฐาน
Like ใช้สัญลักษณ์แทนเท่านั้นและไม่ใช่ทั้งหมดที่ทรงพลัง
ข้อความแบบเต็มช่วยให้การค้นหาที่ซับซ้อนมากขึ้นรวมถึง And, Or, Not แม้กระทั่งผลลัพธ์ที่ทำให้เกิดเสียงที่คล้ายกัน (SOUNDEX) และรายการอื่น ๆ อีกมากมาย
ฉันจะเริ่มดู SQL CONTAINS () FREETEXT () และรายการค้นหา Full Text ที่เกี่ยวข้องเพื่อช่วยให้เข้าใจสิ่งที่มีอยู่ได้ดีขึ้น
ความแตกต่างที่แท้จริงคือวิธีการสแกน สำหรับการค้นหาข้อความแบบเต็มคำ (เงื่อนไข) จะถูกใช้เป็นปุ่มแฮชซึ่งแต่ละคำจะเชื่อมโยงกับอาร์เรย์ของเอกสารที่คีย์ (เงื่อนไข) จะปรากฏในลักษณะนี้:
Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}
ตอนนี้เมทริกซ์เอกสารคำศัพท์ (ซึ่งสมาชิกคำของเอกสารใด) สามารถแสดงเป็น:
t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}
เมื่อมีคำขอเข้ามาเพื่อขอ "รับเอกสารทั้งหมดที่มีคำ / เทอม t1" ให้ส่งชุดเอกสาร{d1, d5, d9,.. dn
}
คุณสามารถแฮ็กสคีมาตารางที่ไม่ได้ทำให้เป็นมาตรฐานเพื่อจัดเก็บเอกสาร - แต่ละแถวในตาราง MySQL จะถือเป็น "เอกสาร" และคอลัมน์ TEXT อาจมีย่อหน้าเป็นต้นดัชนีที่กลับด้านจะมีเงื่อนไขเป็นปุ่มแฮชและรหัสแถว เป็นรหัสเอกสาร
โปรดจำไว้ว่าแบบสอบถาม SQL นี้จะมีประสิทธิภาพ O (1) มากหรือน้อย แบบสอบถามจะไม่ขึ้นกับ
ตัวอย่างเช่น SQL นี้สามารถถูกไล่ออกเพื่อแยกแถวทั้งหมดที่ตรงกับคำที่กำหนด XYZ:
SELECT *
FROM my_table
WHERE MATCH (my_text_column) against ('XYZ' IN boolean mode) ;
ข้อแม้: หากคุณเพิ่ม ORDER BY ในแบบสอบถามนี้เวลาทำงานของคุณจะแตกต่างกันไปตามพารามิเตอร์ต่างๆซึ่งหนึ่งในนั้นคือจำนวนแถว / เอกสารที่ตรงกัน ดังนั้นจงระวัง
อย่างไรก็ตาม LIKE ไม่มีอะไรจากสิ่งนี้ บังคับให้สแกนประโยค / สตริงเชิงเส้นและค้นหาคำที่ตรงกันทั้งหมด การเพิ่มไวด์การ์ดช่วยเพิ่มความยุ่งเหยิง ใช้งานได้ดีกับสตริงที่มีความยาวขนาดเล็กอย่างที่คุณสามารถจินตนาการได้ แต่จะล้มเหลวอย่างน่าสังเวชสำหรับประโยคที่ยาวกว่า และเทียบไม่ได้แน่นอนเมื่อมีข้อความย่อหน้าหรือทั้งหน้าเป็นต้น
FTS มีประสิทธิภาพและมีประสิทธิภาพมากขึ้น (โดยเฉพาะอย่างยิ่งสำหรับ Word Breakers และฟังก์ชัน Stemming) ... แต่ตรวจสอบความต้องการของคุณเนื่องจากบางครั้ง DBs ไม่รองรับทุกภาษาเช่น MSSQL ไม่รองรับภาษากรีก (ตรวจสอบในหน้านี้http: // msdn microsoft.com/en-us/library/ms176076(v=sql.110).aspx )