ค้นหาสัญลักษณ์แทนในคอลัมน์ในตารางขนาดใหญ่ (> 10.000.000 แถว) ใน MySQL

เทคนิคใดที่คุณจะใช้เพื่อค้นหาเนื้อหาในคอลัมน์บนตารางที่มีขนาดใหญ่มากใน MySql เช่น คุณมีอีเมล 10,000,000 ฉบับเก็บไว้ในตารางในฐานข้อมูล และต้องการใช้การค้นหาหัวเรื่อง ซึ่งจะทำให้ฉันสามารถค้นหาคำอย่างน้อยหนึ่งคำที่มีอยู่ในหัวเรื่องอีเมลได้ หากผู้ใช้ค้นหา "คริสต์มาสซานต้า" คุณควรพบอีเมลที่มีหัวเรื่องเช่น "ซานต้ามาเยี่ยมเราในคริสต์มาสนี้" และ "คริสต์มาส ซานต้าจะเคยแสดงไหม"

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

มีวิธีที่ดีกว่าในการค้นหาโดยใช้ไวด์การ์ดบนโต๊ะที่มีขนาดใหญ่มากหรือไม่?

มีฐานข้อมูลที่รองรับการค้นหาประเภทนี้โดยกำเนิดหรือไม่?


person sindre j    schedule 16.12.2008    source แหล่งที่มา


คำตอบ (6)


คุณสามารถใช้ดัชนี FULLTEXT หากคุณใช้ MyISAM เป็นเครื่องมือจัดเก็บข้อมูล อย่างไรก็ตาม โดยทั่วไปแล้ว MySQL ไม่ค่อยดีนักกับการค้นหาข้อความ

ตัวเลือกที่ดีกว่ามากคือการใช้โซลูชันการจัดทำดัชนีข้อความโดยเฉพาะ เช่น Lucene หรือ สฟิงซ์ โดยส่วนตัวแล้ว ฉันขอแนะนำ Sphinx เนื่องจากมีการผสานรวมที่ยอดเยี่ยมกับ PHP และ MySQL และทำงานได้รวดเร็วมาก (สามารถใช้เพื่อเร่งความเร็วในการสืบค้นทั่วไป - ดำเนินการจัดกลุ่มและเรียงลำดับอย่างรวดเร็วมาก)

Wikipedia มีรายการเครื่องมือจัดทำดัชนีต่างๆ มากมาย - ที่นี่

person Eran Galperin    schedule 16.12.2008

ตาราง MyISAM ของ MySQL รองรับดัชนี FULLTEXT ซึ่งช่วยได้ ในการค้นหาเช่นนี้

แต่ไม่ใช่เทคโนโลยีที่รวดเร็วที่สุดสำหรับการค้นหาประเภทนี้ และคุณไม่สามารถใช้กับข้อมูลที่เก็บไว้ในตาราง InnoDB ได้

ฉันได้ยินเรื่องดีๆ เกี่ยวกับ Sphinx Search แต่ฉันยังไม่ได้ใช้เลย

นี่คืออีกบล็อกเกี่ยวกับสฟิงซ์: http://capttofu.livejournal.com/13037.html

person Bill Karwin    schedule 16.12.2008

แม้ว่าดัชนีฟูลเท็กซ์ของ mysql จะเป็นไปได้ แต่ฉันสงสัยว่าฉันจะลองใช้สิ่งที่ออกแบบมาเพื่อเป็นเครื่องมือค้นหาเช่น ลูซีน.

person Zoredache    schedule 18.12.2008

ดูเหมือนเป็นการค้นหาข้อความแบบเต็มซึ่ง SQL Server รองรับ

แต่โดยทั่วไปแล้วความคิดของคุณก็ฟังดูดี คุณกำลังคำนวณ "ดัชนี" บนโต๊ะล่วงหน้าอย่างมีประสิทธิภาพเพื่อเพิ่มความเร็วในการค้นหา

person Craig Shearer    schedule 16.12.2008

คุณต้องการดูฟังก์ชัน MATCH...AGAINST

ดูตัวอย่าง: การใช้การค้นหาข้อความแบบเต็มของ MySQL

person Eli    schedule 16.12.2008
comment
วิธีจัดการกับกฎ 50% โดยใช้ MATCH ----AGAINST - person Manmeet Khurana; 14.05.2018

ตรวจสอบ "การค้นหาข้อความแบบเต็ม" ในเอกสาร MySQL ( AFAIK DBMS ปัจจุบันทั้งหมดรองรับสิ่งนี้)

person Javier    schedule 16.12.2008