Full Text Search vs LIKE คืออะไร


140

ฉันเพิ่งอ่านโพสต์ที่กล่าวถึง "การค้นหาข้อความแบบเต็ม" ใน SQL

ฉันแค่สงสัยว่าความแตกต่างระหว่าง FTS และ LIKE คืออะไร ฉันอ่านบทความสองสามบทความ แต่ไม่พบสิ่งใดที่อธิบายได้ดี

คำตอบ:


174

โดยทั่วไปมีการแลกเปลี่ยนระหว่าง "ความแม่นยำ" และ "การเรียกคืน" ความแม่นยำสูงหมายความว่าจะมีการนำเสนอผลลัพธ์ที่ไม่เกี่ยวข้องน้อยลง (ไม่มีผลบวกที่ผิดพลาด) ในขณะที่การเรียกคืนสูงหมายความว่าผลลัพธ์ที่เกี่ยวข้องน้อยลงจะหายไป (ไม่มีผลลบเท็จ) การใช้ตัวดำเนินการ LIKE ช่วยให้คุณมีความแม่นยำ 100% โดยไม่มีข้อยกเว้นในการเรียกคืน สิ่งอำนวยความสะดวกในการค้นหาข้อความแบบเต็มช่วยให้คุณมีความยืดหยุ่นอย่างมากในการปรับแต่งความแม่นยำเพื่อให้จำได้ดีขึ้น

การใช้งานการค้นหาข้อความแบบเต็มส่วนใหญ่ใช้ "ดัชนีกลับด้าน" นี่คือดัชนีที่คีย์เป็นคำแต่ละคำและค่าที่เกี่ยวข้องคือชุดของระเบียนที่มีคำ การค้นหาข้อความแบบเต็มได้รับการปรับให้เหมาะสมเพื่อคำนวณจุดตัดการรวมกันและอื่น ๆ ของชุดระเบียนเหล่านี้และโดยปกติจะมีอัลกอริทึมการจัดอันดับเพื่อหาจำนวนว่าระเบียนที่ระบุนั้นตรงกับคำค้นหามากเพียงใด

ตัวดำเนินการ SQL LIKE อาจไม่มีประสิทธิภาพอย่างมาก หากคุณใช้กับคอลัมน์ที่ไม่ได้จัดทำดัชนีระบบจะใช้การสแกนแบบเต็มเพื่อค้นหารายการที่ตรงกัน (เช่นเดียวกับแบบสอบถามใด ๆ ในช่องที่ไม่ได้จัดทำดัชนี) หากคอลัมน์ถูกจัดทำดัชนีการจับคู่สามารถดำเนินการกับคีย์ดัชนีได้ แต่มีประสิทธิภาพน้อยกว่าการค้นหาดัชนีส่วนใหญ่มาก ในกรณีที่เลวร้ายที่สุดรูปแบบ LIKE จะมีสัญลักษณ์แทนชั้นนำที่ต้องตรวจสอบทุกคีย์ดัชนี ในทางตรงกันข้ามระบบการดึงข้อมูลจำนวนมากสามารถเปิดใช้งานการสนับสนุนสำหรับอักขระตัวแทนชั้นนำโดยการคอมไพล์ต้นไม้ต่อท้ายในฟิลด์ที่เลือก

คุณสมบัติอื่น ๆ โดยทั่วไปของการค้นหาข้อความแบบเต็ม ได้แก่

  • การวิเคราะห์คำศัพท์หรือโทเค็น - การทำลายบล็อกของข้อความที่ไม่มีโครงสร้างเป็นคำวลีและโทเค็นพิเศษ
  • การวิเคราะห์ทางสัณฐานวิทยาหรือการแยกคำ - การยุบรูปแบบของคำที่กำหนดลงในดัชนีคำเดียว ตัวอย่างเช่นการรักษา "หนู" และ "เมาส์" หรือ "การใช้พลังงานไฟฟ้า" และ "ไฟฟ้า" เป็นคำเดียวกัน
  • การจัดอันดับ - วัดความคล้ายคลึงกันของระเบียนที่ตรงกันกับสตริงข้อความค้นหา

2
การจัดอันดับอธิบายได้ดีกว่าในคำตอบ
ychaouche

40

FTS เกี่ยวข้องกับการจัดทำดัชนีคำแต่ละคำภายในช่องข้อความเพื่อให้การค้นหาผ่านบันทึกจำนวนมากเป็นไปอย่างรวดเร็ว การใช้ LIKE ยังคงต้องการให้คุณค้นหาสตริง (เชิงเส้นหรือสิ่งที่คล้ายกัน) ภายในฟิลด์


27

MySQL สร้างดัชนีจากคำของคอลัมน์การค้นหาข้อความเต็มที่เปิดใช้งานและทำการค้นหาในดัชนีนี้ MySQL ใช้อัลกอริทึมที่ซับซ้อนเพื่อกำหนดแถวที่ตรงกับคำค้นหา

นอกจากนี้จากคำตอบ SO นี้ :

การค้นหาข้อความแบบเต็มมีข้อดีบางประการ

การจัดทำดัชนี:

สิ่งที่ต้องการ:

WHERE Foo LIKE '%Bar';

ไม่สามารถใช้ประโยชน์จากดัชนี จะต้องดูทุกแถวและดูว่าตรงกันหรือไม่ อย่างไรก็ตามดัชนีแบบเต็มสามารถทำได้ ในความเป็นจริงดัชนีแบบเต็มสามารถให้ความยืดหยุ่นมากขึ้นในแง่ของลำดับของคำที่ตรงกันคำเหล่านั้นอยู่ใกล้กันเพียงใด ฯลฯ

ต้นกำเนิด:

การค้นหาแบบเต็มข้อความสามารถทำให้เกิดคำได้ หากคุณค้นหาคำว่า run คุณจะได้รับผลลัพธ์สำหรับ "ran" หรือ "running" เอ็นจิ้นฟูลเท็กซ์ส่วนใหญ่มีพจนานุกรมต้นกำเนิดในหลายภาษา

ผลลัพธ์ถ่วงน้ำหนัก:

ดัชนีแบบเต็มสามารถครอบคลุมหลายคอลัมน์ ตัวอย่างเช่นคุณสามารถค้นหา "พายลูกพีช" และดัชนีอาจมีชื่อคำหลักและเนื้อหา ผลลัพธ์ที่ตรงกับชื่อสามารถถ่วงน้ำหนักให้สูงขึ้นตามความเกี่ยวข้องมากขึ้นและสามารถจัดเรียงให้แสดงใกล้ด้านบน

ข้อเสีย:

ดัชนีเต็มรูปแบบอาจมีขนาดใหญ่กว่าดัชนี B-TREE มาตรฐานหลายเท่า ด้วยเหตุนี้ผู้ให้บริการโฮสต์หลายรายที่เสนออินสแตนซ์ฐานข้อมูลจึงปิดใช้งานคุณสมบัตินี้หรืออย่างน้อยก็คิดค่าบริการเพิ่มเติม ตัวอย่างเช่นล่าสุดที่ฉันตรวจสอบ Windows Azure ไม่รองรับการสืบค้นแบบเต็มข้อความ

ดัชนีแบบเต็มอาจอัปเดตได้ช้าลง หากข้อมูลเปลี่ยนแปลงมากอาจมีความล่าช้าในการอัปเดตดัชนีเมื่อเทียบกับดัชนีมาตรฐาน


16

Like ใช้สัญลักษณ์แทนเท่านั้นและไม่ใช่ทั้งหมดที่ทรงพลัง

ข้อความแบบเต็มช่วยให้การค้นหาที่ซับซ้อนมากขึ้นรวมถึง And, Or, Not แม้กระทั่งผลลัพธ์ที่ทำให้เกิดเสียงที่คล้ายกัน (SOUNDEX) และรายการอื่น ๆ อีกมากมาย

ฉันจะเริ่มดู SQL CONTAINS () FREETEXT () และรายการค้นหา Full Text ที่เกี่ยวข้องเพื่อช่วยให้เข้าใจสิ่งที่มีอยู่ได้ดีขึ้น


2
ฉันขอแนะนำให้ทุกคนตรวจสอบSOUNDEX
sotn

11

ความแตกต่างที่แท้จริงคือวิธีการสแกน สำหรับการค้นหาข้อความแบบเต็มคำ (เงื่อนไข) จะถูกใช้เป็นปุ่มแฮชซึ่งแต่ละคำจะเชื่อมโยงกับอาร์เรย์ของเอกสารที่คีย์ (เงื่อนไข) จะปรากฏในลักษณะนี้:

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) มากหรือน้อย แบบสอบถามจะไม่ขึ้นกับ

  1. จำนวนคำ / คำศัพท์ในคอลัมน์ TEXT
  2. จำนวนแถว / เอกสารที่ตรงกับเกณฑ์
  3. ความยาวของคำ / เงื่อนไข

ตัวอย่างเช่น SQL นี้สามารถถูกไล่ออกเพื่อแยกแถวทั้งหมดที่ตรงกับคำที่กำหนด XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

ข้อแม้: หากคุณเพิ่ม ORDER BY ในแบบสอบถามนี้เวลาทำงานของคุณจะแตกต่างกันไปตามพารามิเตอร์ต่างๆซึ่งหนึ่งในนั้นคือจำนวนแถว / เอกสารที่ตรงกัน ดังนั้นจงระวัง

อย่างไรก็ตาม LIKE ไม่มีอะไรจากสิ่งนี้ บังคับให้สแกนประโยค / สตริงเชิงเส้นและค้นหาคำที่ตรงกันทั้งหมด การเพิ่มไวด์การ์ดช่วยเพิ่มความยุ่งเหยิง ใช้งานได้ดีกับสตริงที่มีความยาวขนาดเล็กอย่างที่คุณสามารถจินตนาการได้ แต่จะล้มเหลวอย่างน่าสังเวชสำหรับประโยคที่ยาวกว่า และเทียบไม่ได้แน่นอนเมื่อมีข้อความย่อหน้าหรือทั้งหน้าเป็นต้น


3

FTS มีประสิทธิภาพและมีประสิทธิภาพมากขึ้น (โดยเฉพาะอย่างยิ่งสำหรับ Word Breakers และฟังก์ชัน Stemming) ... แต่ตรวจสอบความต้องการของคุณเนื่องจากบางครั้ง DBs ไม่รองรับทุกภาษาเช่น MSSQL ไม่รองรับภาษากรีก (ตรวจสอบในหน้านี้http: // msdn microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.