משיב מוביל
שאלה בFull Text Search בעברית

שאלה
-
יש לי טבלת Books המכילה את הספרים הבאים:
1 ר' יהודה החסיד
2 הבעש"ט מחדש החסידות
3 מסע אל החירות : ליל הסדר כתהליך צמיחה - קבלה; חסידות; פסיכואנליזה
4 בכל דרכיך דעהו: תפיסת האלוהות והעבודה בגשמיות בראשית החסידותטבלה זו מאונדקסת בFTS כאשר לעמודת שם הספר מוגדרת עברית כWord breaker
בביצוע השאילתא הבאה לא חוזרות תוצאות:
select nBookId,sName from Books where sName like '%חסידה%'
בביצוע שאילתת FTS כזאת:
SELECT B.sName FROM Books B WHERE CONTAINS(B.sName, '"חסידה"')
חוזרות כל 4 הרשומות המפורטות למעלה.בעוד בביצוע השאילתא הבאה:
SELECT B.sName FROM Books B WHERE CONTAINS(B.sName, '"חסיד"')
חוזרת רק הרשומה של:
1 ר' יהודה החסיד
אשמח לקבל הסבר להבדל בין תוצאות השאילתות השונות.
תשובות
-
ההסבר פשוט :-)
השאילתה הראשונה לא עושה שימוש ב FTS בכלל אלא פשוט מחזירה תוצאות שיש בהם את המילה "חסידה" ולכן לא חזרו שום רשומות
השאילתה השנייה והשלישית עובדות לפי הלוגיקה של FTS של מייקרוסופט. אני לא יודע בדיוק מה האלגוריתמים של מייקרוסופט אבל אני מכיר אלגוריתמים אחרים בשוק (חלקם היו מביאים תוצאות דומות וחלק תוצאות שונות אולי).
על פי מה שנראה לוגיקה זו קובעת בעברית שהאות "ה" יכולה להיות כתוצאה מ"נקבה" של שם עצם למשל ולכן היא למעשה כמעט מתעלמת מהאות ה בסיום ומחזירה כל תוצאה התואמת ל"חסיד" ולהטיות של המילה (כולל מה שנראה כרבים של שם העצם למשל כמו "חסידים") וכמובן גם להטיות של המילה "חסידה" ולכן אתה מקבל חזרה גם את "חסידות" שזה מביא את שלושת התוצאות האחרונות. לעומת זאת כשחיפשת "חסיד" לא קיבלת את ההטיות של "חסידה" ולכן לא קיבלת את "חסידות" ולכן לא חזרו שלושת התוצאות האחרונות
* ב FTS ניתן להגדיר דרך אגב גם עד כמה אתה רוצה לדיק בתוצאות ופרמטרים רבים של החיפוש. בכל מקרה העברית ב FTS של SQL לא מושלמת עדיין (למשל לזכרוני בשימוש במילות קישור שבעברית מתחברות למילה אחת כמו "לחסיד" שבאנגלית זה מתקבל כ "to XXX" בנפרד)
- הוצע כתשובה על-ידי Assaf_Shalem יום חמישי 05 ינואר 2012 07:42
- סומן כתשובה על-ידי Meir DudaiModerator יום ראשון 08 ינואר 2012 17:15
-
:-)
שאלות יפות אבל מתאימות יותר לשיעור או הרצאה מלאה :-)
הפורום זה לא המקום ללמוד משהו מאפס לדעתי. אני ממליץ לך אם הנושא מעניין אותך ללמוד את הנושא של FTS מההתחלה כי אנחנו כאן נוגעים בנקודות בלי כל בסיס. זה נושע מאוד מעניין. אם אתה רוצה אני יכול להפנות אותך לפרוייקט עברית של קוד פתוח של מנוע FTS (שגם עובד לבדיקתי הרבה יותר טוב מזה של ה SQL) אני משלב את מנוע ה FTS גם באפליקציות דוט-נט למשל בלי קשר למסדי נתונים. כתבתי עליו בהודעה אחרת שנשאלה כאן בפורום בקישור הבאלמשל אם יש לך אפליקציה שיש בה חלון חיפוש של קבצים או כל דבר שהוא אז אפשר לבצע חיפוש בעזרת FTS של קבצים שהשם שלהם קרוב לשם שמחפשים (כמו בשרת SQL בע'קרון)
לעצם השאלה התשובה שוב היא פשוטה וקלה:-)
אני אנסה לרשום כמה מילים "בשפת העם" גם אם לא 100% מלאות ומדוייקות :-)
FTS הוא מנוע מובנה לפי שפה והוא בהחלט מכיר את השפה העברית כל עוד מערכת ההפעלה מכירה את העברית. זה היכולת הגבוהה שלו. היכולת לקחת מילה ו"להבין" כאילו את המשמעות שלה וכך למצוא מילים דומות (ויש מנועי FTS שגם מוצאים מילים נרדפות שבכלל לא דומות). שוב אני לא עובד מייקרוסופט ולא מכיר ספציפית את האלגוריתמים שלהם אבל תזכור שהוא רץ במערכות שמכירות את השפה העברית (* ראה הערה בהמשך לגבי הקשר ל OS) ובמקרה של SQL הוא עובד לפי האלגוריתים של מייקרוסופט. חיפוש בעברית תיאורטית מבצע חיפוש לפי עברית גם אם בשדה יש תוכן גם בשפה נוספת בדרך כלל.* ולגבי ה OS יש לזכור ש FTS עושה שימוש ברכיב חיצוני במערכת ההפעלה למעשה בשם Microsoft Search (MSSearch) service .
- הוצע כתשובה על-ידי Assaf_Shalem יום חמישי 05 ינואר 2012 07:42
- סומן כתשובה על-ידי Meir DudaiModerator יום ראשון 08 ינואר 2012 17:16
כל התגובות
-
ההסבר פשוט :-)
השאילתה הראשונה לא עושה שימוש ב FTS בכלל אלא פשוט מחזירה תוצאות שיש בהם את המילה "חסידה" ולכן לא חזרו שום רשומות
השאילתה השנייה והשלישית עובדות לפי הלוגיקה של FTS של מייקרוסופט. אני לא יודע בדיוק מה האלגוריתמים של מייקרוסופט אבל אני מכיר אלגוריתמים אחרים בשוק (חלקם היו מביאים תוצאות דומות וחלק תוצאות שונות אולי).
על פי מה שנראה לוגיקה זו קובעת בעברית שהאות "ה" יכולה להיות כתוצאה מ"נקבה" של שם עצם למשל ולכן היא למעשה כמעט מתעלמת מהאות ה בסיום ומחזירה כל תוצאה התואמת ל"חסיד" ולהטיות של המילה (כולל מה שנראה כרבים של שם העצם למשל כמו "חסידים") וכמובן גם להטיות של המילה "חסידה" ולכן אתה מקבל חזרה גם את "חסידות" שזה מביא את שלושת התוצאות האחרונות. לעומת זאת כשחיפשת "חסיד" לא קיבלת את ההטיות של "חסידה" ולכן לא קיבלת את "חסידות" ולכן לא חזרו שלושת התוצאות האחרונות
* ב FTS ניתן להגדיר דרך אגב גם עד כמה אתה רוצה לדיק בתוצאות ופרמטרים רבים של החיפוש. בכל מקרה העברית ב FTS של SQL לא מושלמת עדיין (למשל לזכרוני בשימוש במילות קישור שבעברית מתחברות למילה אחת כמו "לחסיד" שבאנגלית זה מתקבל כ "to XXX" בנפרד)
- הוצע כתשובה על-ידי Assaf_Shalem יום חמישי 05 ינואר 2012 07:42
- סומן כתשובה על-ידי Meir DudaiModerator יום ראשון 08 ינואר 2012 17:15
-
זה אכן מסביר את השאילתא כששפת השאילתא (בברירת המחדל) היא עברית אך מה ההסבר לכך שכשפת השאילתא אינה עברית עדיין חוזרות חלק מהתוצאות?
בשאילתא הבאה:
SELECT B.sName FROM Books B WHERE CONTAINS(B.sName, '"חסידה"' , LANGUAGE 0)
חוזרות הרשומות הבאות:
2 הבעש"ט מחדש החסידות
3 מסע אל החירות : ליל הסדר כתהליך צמיחה - קבלה; חסידות; פסיכואנליזה
4 בכל דרכיך דעהו: תפיסת האלוהות והעבודה בגשמיות בראשית החסידותללא רשומת :
1 ר' יהודה החסיד
הרי אם אני משתמש בשפה שאיננה עברית הוא אמור לחפש את המחרוזת המדוייקת שכן הוא לא אמור לדעת את ההטיות השונות בעברית.
מה ההסבר לכך?
-
:-)
שאלות יפות אבל מתאימות יותר לשיעור או הרצאה מלאה :-)
הפורום זה לא המקום ללמוד משהו מאפס לדעתי. אני ממליץ לך אם הנושא מעניין אותך ללמוד את הנושא של FTS מההתחלה כי אנחנו כאן נוגעים בנקודות בלי כל בסיס. זה נושע מאוד מעניין. אם אתה רוצה אני יכול להפנות אותך לפרוייקט עברית של קוד פתוח של מנוע FTS (שגם עובד לבדיקתי הרבה יותר טוב מזה של ה SQL) אני משלב את מנוע ה FTS גם באפליקציות דוט-נט למשל בלי קשר למסדי נתונים. כתבתי עליו בהודעה אחרת שנשאלה כאן בפורום בקישור הבאלמשל אם יש לך אפליקציה שיש בה חלון חיפוש של קבצים או כל דבר שהוא אז אפשר לבצע חיפוש בעזרת FTS של קבצים שהשם שלהם קרוב לשם שמחפשים (כמו בשרת SQL בע'קרון)
לעצם השאלה התשובה שוב היא פשוטה וקלה:-)
אני אנסה לרשום כמה מילים "בשפת העם" גם אם לא 100% מלאות ומדוייקות :-)
FTS הוא מנוע מובנה לפי שפה והוא בהחלט מכיר את השפה העברית כל עוד מערכת ההפעלה מכירה את העברית. זה היכולת הגבוהה שלו. היכולת לקחת מילה ו"להבין" כאילו את המשמעות שלה וכך למצוא מילים דומות (ויש מנועי FTS שגם מוצאים מילים נרדפות שבכלל לא דומות). שוב אני לא עובד מייקרוסופט ולא מכיר ספציפית את האלגוריתמים שלהם אבל תזכור שהוא רץ במערכות שמכירות את השפה העברית (* ראה הערה בהמשך לגבי הקשר ל OS) ובמקרה של SQL הוא עובד לפי האלגוריתים של מייקרוסופט. חיפוש בעברית תיאורטית מבצע חיפוש לפי עברית גם אם בשדה יש תוכן גם בשפה נוספת בדרך כלל.* ולגבי ה OS יש לזכור ש FTS עושה שימוש ברכיב חיצוני במערכת ההפעלה למעשה בשם Microsoft Search (MSSearch) service .
- הוצע כתשובה על-ידי Assaf_Shalem יום חמישי 05 ינואר 2012 07:42
- סומן כתשובה על-ידי Meir DudaiModerator יום ראשון 08 ינואר 2012 17:16
-
שלום,
אם אחת מן התשובות פתרה או עזרה לפתור את בעייתך, אנא סמן אותה על ידי לחיצה על "סמן כתשובה".
אם מצאת פתרון אחר, נשמח אם תשתף אותנו.
תודה,
צוות הפורומים.
אם תגובתי פתרה את בעייתך - לחץ/י, על "סמן כתשובה" ליד סימן ה V הירוק. מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של Microsoft. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט. לשאלות נוספות אתם מוזמנים לפנות לדף התמיכה הראשי של מיקרוסופט ישראל בכתובת: http://support.microsoft.com/contactus/?ws=mscom#tab0 -
שלום,
אם אחת מן התשובות פתרה או עזרה לפתור את בעייתך, אנא סמן אותה על ידי לחיצה על "סמן כתשובה".
אם מצאת פתרון אחר, נשמח אם תשתף אותנו.
תודה,
צוות הפורומים.
אם תגובתי פתרה את בעייתך - לחץ/י, על "סמן כתשובה" ליד סימן ה V הירוק. מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של Microsoft. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט. לשאלות נוספות אתם מוזמנים לפנות לדף התמיכה הראשי של מיקרוסופט ישראל בכתובת: http://support.microsoft.com/contactus/?ws=mscom#tab0
עוד לא מצאתי תשובה אך אני חושב שהעניין עוד לא ממש פתור.... -
אנסה לחדד את הבעיה .
שימוש בשאילתת sys.dm_fts_parser בשפה האנגלית עבור חסידה - מחזיר כExact Match רק את המילה "חסידה" ובעבור המילה חסידות - מחזיר כExcat Match רק את "חסידות".
--English 1033 select * from sys.dm_fts_parser ('"חסידה"', 1033, 0,0) select * from sys.dm_fts_parser ('"חסידות"', 1033, 0,0)
בעוד שביצוע השאילתא עבור עברית מחזירה תוצאות אחרות.
עבור חסידה - מחזיר כExact Match את "חסידה" ו"חסיד"
--Hebrew 1037 select * from sys.dm_fts_parser ('"חסידה"', 1037, 0,0)
עבור חסידות - מחזיר כExact Match את "חסידה" ו"חסידות"
--Hebrew 1037 select * from sys.dm_fts_parser ('"חסידות"', 1037, 0,0)
כעת נקח את אחת התוצאות החוזרות ונשתמש בפונקציה
--English 1033 select * from sys.dm_fts_parser ('"הבעש""ט מחדש החסידות"', 1033, 0,0)
התוצאההחוזרת היא שרק עבור המילה "חסידות" יש Exact Match וע"כ ממש לא ברור איך שימוש בשאילתת CONTAINS מחזירה מחזיר את התוצאה הזאת:
SELECT B.sName FROM Books B WHERE CONTAINS(B.sName, '"חסידה"' , LANGUAGE 1033)
למי פתרונים?