הבלוג של גרי רשף

16/06/2010

חיפוש מילים שלמות בתוך מחרוזת

Filed under: Uncategorized — תגיות: , , , — גרי רשף @ 10:59

לכאורה לא מסובך במיוחד- ניצור טבלה עם נתונים ונחפש באילו שורות מופיע גד:

Use tempdb;

Go

 

If Object_Id('T_Hipus') Is Not Null Drop Table T_Hipus

Go

Create Table T_Hipus(Mone Int, Mishpat Varchar(Max));

Go

 

Insert Into T_Hipus

Select    1,'פגשתי את גד ברחוב'

Union All

Select    2,'פגשתי את גדי ברחוב'

Union All

Select    3,'פגשתי אותו בגדרה'

Union All

Select    4,'גד הלך לטייל'

Union All

Select    5,'ראיתי ברחוב את גד'

Union All

Select    6,'בצעירותי מילאתי חיש-גד כל שבוע'

Union All

Select    7,'הסיסמה שלי היא גד123 מעתה ואילך'

Union All

Select    8,'פגשתי ברחוב את גד, דנה ורות'

Union All

Select    9,'פגשתי אותו (גד) ברחוב';

והחיפוש:

Select    *

From    T_Hipus

Where    Mishpat Like '%גד%';

אלא שכך אנחנו מקבלים את כולם- כולל את גדי ואת גדרה.

אפשרות משופרת היא לחפש את ' גד ' (רווח מימין ורווח משמאל), אלא שאז נפספס את גד משורה 5 שמופיע בסוף המשפט.

נשפר את החיפוש ונוסיף לעמודה Mishpat רווח מימין ורווח משמאל לטובת מה שנמצא בהתחלה או בסוף, אלא שאז עדיין יש לנו בעייה עם גד משורות 8-9 שיסונן רק בגלל פסיקים או סוגריים, וכך הלאה..

הפתרון שלהלן מעט מסורבל אבל עובד- נגדיר מה אסור שיופיע לפני או אחרי 'גד': אות עברית או לועזית. לשם כך נשתמש בפונקציה PatIndex שמחפשת את מיקומו (Index) של מופע בתוך מחרוזת לפי תכונות (Patterns):

Select    *

From    T_Hipus

Where    PatIndex('%[^א-ת,^a-Z]גד[^א-ת,^a-Z]%',' '+Mishpat+' ')<>0;

התצוגה מעט משובשת בגלל העברית למרות שהפקודה עובדת ללא דופי, ולצורך הבהירות אני אציג אותה עם Gad במקום גד:

Where    PatIndex('%[^א-ת,^a-Z]Gad[^א-ת,^a-Z]%',' '+Mishpat+' ')<>0

כלומר- גד כשהתו שלפני ואחריו אינו בתחום א-ת ואינו בתחום a-z (התו ^ מציין שלילה).

כעת השליפה מחזירה את שורות 1,4,5,6,7,9.

האם הזיהוי של גד123 נכונה? אם לא, ניתן להוסיף לרשימה גם את הספרות 0-9 כך:

[^א-ת,^a-Z,^0-9]

יש לשים לב שללא מערכת מורכבת מאוד של ניתוח טקסט מבחינת התחביר והמשמעות – לא נוכל לזהות את גדי בתור כינוי חיבה של גד, ואת חיש-גד בתור סוג של הגרלה שאינה מציינת שם פרטי..

בנוסף כדאי להיות ערים ל-Collation של הדטבייס והטבלה שעלול לגרום במקרים מסויימים לבעיות בהבחנה בין אותיות גדולות וקטנות (בלועזית), אותיות סופיות (בעברית) וכך הלאה.

מודעות פרסומת

2 תגובות »

  1. למה לא לעבוד עם FULLTEXT שיוצר מיפוי של המילים?

    תגובה של פלג — 16/06/2010 @ 11:31

    • פלג- אתה צודק ואולי היה ראוי שאוסיף על כך הערה בפוסט: FULLTEXT הוא פתרון מובנה ומאונדקס ובוודאי יעיל יותר ממה שהצגתי.
      אני התייחסתי לחיפוש מאולתר או חד פעמי, בלי להסתבך עם שינויים והגדרות בדטבייס..

      תגובה של גרי רשף — 16/06/2010 @ 15:09


RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: