חיפוש טקסט מלא MySQL

היום שיחקתי לייעל איטי SQL יישום של הסוג

SELECT * FROM 'table' WHERE `field` LIKE '%word%'

איפה הבעיה עכשיו כאן – החלק האחרון '% מילת%’ וב אפילו יותר ספציפי תווים % לפני המילה, אשר עושה. תו כללי % ,לפני כל ערך, ישירות גורם לנו שאילתה ישירות לתוך איטי, כי בדרך זו את היישום עוצר אותנו להשתמש מדדי שדה. החלטות כמו תמיד, אבל לא תמיד ברור 😆 בסך הכל MySQL יש להם פתרון לבעיה זו חיפוש טקסט מלא שדה לאינדקס. איך לשנות את השדה יש ​​הרבה תיעוד בכתב, אבל חיפזון יתאר כיצד לשנות את הבקשה העליונה, כי נגיע דרמה קטנה ולבסוף. Sledka כשדה טקסט מלא רלוונטי למעלה, הבקשה חייבת להיות שינויים בסוג:

SELECT * FROM `table` WHERE MATCH (field) AGAINST ('word')

אז המבנה הוא מובן מאליו, ומצריך דיון מיותר. השאילתה הנ"ל תיכנס לתוקף, אם המילה, בשבילך להגיש בקשה לפחות 4 סימנים, ערך ברירת המחדל הוא, אם אתה רוצה לשנות חייב לציין את הערך, която желаете в my.cnf в частта [mysqld] הכרזה ft_min_word_len= 3 או 2, 1 не е добър избор очевидно 😉 . לאחר שתשנה את שרת ערך והפעלה מחדש mysql צורך לעשות תיקון על השולחנות שלך, על מנת האינדקס החדש ייכנסו לתוקף. עד כה הכל ברור: לבצע שינויים, לאפס, rebildvam אינדקסים לעשות בקשה וחוזר שלי 0 בדיקה עם הסדר 😀

SHOW VARIABLES

אני רואה שהערכים, ביקשתי בתוקף, rebildvam שוב אינדקסים – אותה תוצאה. 🙄 נעימה, מאוד לא נוח. מכאן ואילך זה התחיל לקלל גדול מגרד את המפתח מתחת לסככת 😀 שהייתה די, די מעניין. על כל, התחלתי לקרוא את התיעוד לא יודע באיזו דרך והגעתי בקטע מעניין

Such a technique works best with large collections (למעשה, זה היה מכוון ככה בזהירות). עבור טבלאות קטנה מאוד, חלוקת מילה אינה משקפת את השווי הסמנטי שלהם כראוי, ו מודל זה עשוי לפעמים להניב תוצאות מוזרות. לדוגמה, אם כי המילה "MySQL" נוכחת בכל שורה של טבלת מאמרים שראתה קודם, חיפוש אחר המילה לא מייצר תוצאות

ГРЕДА 😳 Дам табличката ми беше малка – עם זאת, היה מבחן. היישום שלנו ב שולחן גדול מעל 2 000 000 סדר הדברים שם ישנו. ובכן עכשיו בעיה ברורה. כדי לקבל החלטה ברורה, אזכיר בקצרה, תומך חיפוש טקסט מלא 3 מצב מתקדם BOOLEAN , ביטויים ו שפה טבעית כעבודה האחרונה כברירת מחדל. עבור מצבים יכול לבדוק תיעוד, אני אסביר 2-3 מילות BOOLEAN כי זה הוא המפתח. הוא תומך באופרטורים לוגיים כגון AND, אוֹ , לא וכן הלאה והוא יכול לעשות קסמים עם ביטויים פופולריים, יש אחד, אין וכו אחרים. לשמור וסמלים *, שהוא שווה ערך ל תו כללי % זה שימושי 😉, כאשר מונח החיפוש הוא פחות מאורך ft_min_word_len או מגשים קטנים ;). לפחות לי שולחן עם כ 100 כדי עושה עבודה מושלמת. השארתי רק לראות ושל בקשה:

SELECT * FROM `table` WHERE MATCH (field)
AGAINST ('*word*' IN BOOLEAN MODE)

הנה מגיע הרגע אם לאינדקס שלנו עובד עם תווים כלליים – התשובה היא שאני לא יודע. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

משופר על ידי Zemanta

2 הערות

    1. Е при големи таблици вече има други решения 😉 partitions да речем или други механизмни за fulltext search като Sphinx

השאר תגובה

כתובת הדוא ל שלך לא יפורסם. שדות חובה מסומנים *

אנטי-ספאם *