Oracle Text For Dummies - חלק א - ilDBA Portal

Oracle Text For Dummies – חלק א

08/01/2014 | פורסם על ידי

שלום לכולם!

כולכם בוודאי שמעתם את המושג "אורקל טקסט" או "טקסט אינדקס" בהקשר זה או אחר… אולי ניתקלתם בטבלאות DR$ , או במושג "Domain Index". אם אתם רוצים להכיר עוד קצת (ממש על קצה המזלג) את הפיצ'ר המגניב והמאוד שימושי הזה שבאמת שווה להכיר- הגעתם למקום הנכון! במאמר זה אציג את הפיצ'ר oracle text, ואדגים מספר שימושים פשוטים שאפשר ליישם באמצעותו.

למה זה משמש?

כשמו כן הוא, אורקל טקסט משמש לחיפוש טקסטואלי על טקסט כלשהו, הטקסט יכול להיות שדה מסוג varchar2, קובץ word ששמור כblob בDB, קובץ בfile system ועוד. למה צריך את זה? כל חיפוש על טקסט ואפילו פשוט ביותר כמו "מילים שנגמרות ב"ה"" יצריך אינדקס מיוחד. שימוש באופרטור המוכר והאהוב like על מחרוזות בצירוף עם אינדקס Btree על שדה מחרוזתי, יעשה שימוש באינדקס רק אם מחפשים מחרוזת לפי prefix (תחילית). כל קומבינציה אחרת בדרך כלל תצריך טיפול מיוחד- ואם לא יעשה טיפול כזה יתבצע full scan.

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

אז מה מאנדקסים כאן?

מה שעושה את הכלי הזה לכל כך פשוט ונוח הוא התמיכה שלו במגוון רחב מאוד של פורמטים טקסטואליים. קבצי word (doc/docx),html, WXL, שדות טקסט רגילים בDatabase ועוד. המידע שאנו רוצים לאנדקס יכול לשבת פיזית בDatabase או חיצונית לו (למשל ברשת או בFilesystem).

אז איך עובדים עם זה?

כמו שאנחנו מכירים… פקודות SQL סטנדרטיות, שאליהן נצרף אופרטורים של חיפוש במקרה של שליפה או פרמטרים ופקודות DDL ייחודיות לאורקל טקסט במקרה של יצירה, עדכון או מחיקת אינדקס. העובדה שהשליפה מתבצעת באמצעות פקודות SQL מאפשרת לנו לשלב באופן פשוט מאוד שליפות טקסטואליות עם שליפות על שדות אחרים.

איך מתבצע האינדוקס?

האינדקסים שאנו יוצרים בעזרת אורקל טקסט נקראים "Domain Indexes". מונח זה מתאר משפחה גדולה של אינדקסים שמעוצבים לתחום ייחודי ("מקצועי") מסוים.

תהליך יצירת האינדקס, מתבצע באמצעות ממספר רכיבים:

  1. Datastore – קריאת המידע מהמקום שבו הטקסט מאוכסן.
  2. Filter – פילטור הטקסט שאותו נאנדקס בהמשך מתוך הטקסט כולו. למשל במקרה של טקסט שמכיל טגיות HTML, שאותן נרצה לסנן ולא להעביר הלאה לתהליך האינדוקס עצמו.
  3. Sectioner – שלב שרלוונטי לMarked-up טקסט, ובו המידע המפולטר מתחלק לטקסט ולSection information (מידע אודות הsections בטקסט, שנדרש לתהליך האינדוקס והחיפוש).
  4. Lexer – ביצירת אינדקס יש לבחור lexer עבור השפה שבה כתוב הטקסט. הlexer מחלק את הטקסט לtokens בהתאם לשפה שנבחרה.
  5. Indexing engine- יוצר את האינדקס עצמו, ע"י מיפוי tokens למסמך (או לשדה) שמכיל אותו.

ועכשיו להדגמה!

ראשית ניצור יוזר וניתן לו הרשאות מתאימות:

CREATE USER text_demo IDENTIFIED BY text_demo DEFAULT TABLESPACE text_ts TEMPORARY TABLESPACE temp;
GRANT connect, resource, ctxapp TO text_demo;

ניצור טבלת "מאמרים" (Articles) באופן הבא:

CREATE TABLE articles (
   id               NUMBER
 , name             VARCHAR2(20)
 , writer_id        number
 , date_modified     date
 , description       VARCHAR2(200));

נכניס לטבלה מספר שורות:

INSERT INTO articles VALUES (1,'Wikipedia',12,sysdate,'Be Careful when using this amazing tool');
INSERT INTO articles VALUES (2,'Chinchilla',12,sysdate,'The Best Way to Care for Your Chinchilla');
INSERT INTO articles VALUES (3,'Rome',21,sysdate,'3 Great Places to go in Rome');
INSERT INTO articles VALUES (4,'Trans Fat',13,sysdate,'This is going to be your last Croissant, and the best thing you ever did for yourself');

כעת נאנדקס את הטור description:

CREATE INDEX description_text_idx ON articles (description) INDEXTYPE IS CTXSYS.CONTEXT;

בשלב האינדוקס בדרך כלל נכניס פרמטרים של Datastore,Lexer וכו.., אך בדוגמא זו השתמשתי בצורה הבסיסית ביותר, שבה ייווצר האינדקס עם הרכיבים הבסיסיים והדיפולטיים של הlexer, datastore וfilter.

השלב הבא הוא כמובן השליפה. בשביל לשלוף מcontext index יש להשתמש באופרטור contains.

SELECT id, name, description FROM articles WHERE CONTAINS (description,' Croissant ',1) >0;

כפי שניתן לראות בדוגמא האופרטור מקבל את הטור שבו נרצה לחפש, את "מחרוזת החיפוש" (בהמשך נראה שהאפשרויות פה הן מאוד גדולות, הכנסת תגיות XML\HTML, אופרטורים נוספים ועוד), ועמודה אופציונאלית של תווית (label)- שמגדירה את המזהה של הscore.

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

נחזור רגע לשליפה שלנו…

השליפה החזירה:

Id                  name                          description
----                --------                      -------------
4                   Trans Fat                     This is going to be
                                                  your last Croissant,
                                                  and the best thing you
                                                  ever did for yourself

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

השליפה:

SELECT id, name, description FROM articles WHERE CONTAINS (description,'$go',1) >0;

תחזיר במקרה זה את השורות ה-3 וה-4 (go,going).

בהדגמה השתמשתי באינדקס שנקרא CONTEXT INDEX, אך זה אינו הסוג היחיד שניתן ליצור. CONTEXT INDEX משמש בדרך כלל לאינדוקס של קבצי טקסט גדולים יחסית וקוהרנטיים.

אם המטרה שלכם היא לאנדקס שדות טקסט (או מסמכים) קצרים, או ליצור אינדקס שמשלב בין כמה מאפיינים מסוגים שונים (טקסטואלים לצד נומרים למשל) – תרצו להשתמש בCatalog Index) CTXCAT). כשמו כן הוא, נועד לאינדוקס של "קטלוג".  נסתכל לדוגמא על אינדוקס של נתוני חנות נעליים, כאשר כל רשומה כוללת מידע אודות הנעל- מידע טקסטואלי (שם הדגם, תיאור הנעל) אך לצידו מידע נומרי (מידה, מחיר או קוד למשל), ותאריכי (תאריך יצור, תאריך קניה וכו). כעת נרצה לבצע שליפה ולהביא את הנעליים מסוג "nike" שנקנו בשבוע האחרון. אם נבחר להשתמש בcontext אינדקס לאינדוקס שדות הטקסט, השליפה תהיה איטית וכבדה יחסית, ותצריך חיפוש במספר אינדקסים שונים. היופי בctxcat הוא שהוא מובנה בדיוק לביצוע של חיתוכים על מידע, הוא מורכב מתת אינדקסים שמרכיבים "סט של אינדקסים" שאורקל טקסט יודע לעשות בו שימוש יעיל לצורך השליפה. מצד שני אם אתם חפצים ביכולות טקסטואליות מתקדמות יותר, כמו חיפוש לפי שורש, מילים נרדפות וכו, ctxcat לא יכול לענות על דרישותיכם.

הבדל נוסף בין האינדקסים הוא שctxcat הוא טרנזקציוני ומתעדכן אוומטית לאחר ביצוע של פקודות DML על הטבלה. לעומתו context index דורש הרצת פקודת סנכרון (הרצת הפרוצדורה: CTX_DDL.SYNC_INDEX).

כמו כן קיימים שני סוגים נוספים-  CTXRULE שנועד בעיקר לסיווג מסמכים (לדוגמא האם המסמך הוא על "חתול" או על "כלב"), וCTXPATH שמשמש לאינדוקס שדות XML (קיים למטרת תמיכה אחורה, לא מומלץ להשתמש בו).

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

The following two tabs change content below.

שרי דן

Latest posts by שרי דן (see all)

2 תגובות ל- “Oracle Text For Dummies – חלק א”

commenter

מגניב!!

commenter

מגניב לגמריי

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

שחזור טבלה באמצעות RMAN

בפוסט זה אציג פיצ'ר שאורקל הוסיפו בגרסת  12c (12.1.0.1 ליתר דיוק) – שחזור טבלה\טבלאות לנקודת זמן מסוימת באמצעות RMAN. הפיצ'ר יכול להיות שימושי במקרים הבאים: נמחק או השתנה המידע בטבלה ולא ניתן להשתמש [...]
PL/SQL

PL/SQL Injection – The Beginning

עודד רז פותח בסדרת מאמרים על Pl/sql [...]

תיעוד בסיס הנתונים – למה זה טוב?

ישנם מספר נושאים חשובים שיש לתת עליהם את הדעת בפיתוח ותכנון בסיס נתונים. כמובן שצריך לשים לב לנירמול נכון של הטבלאות, וכמובן שצריך להגדיר סטנדרט לכתיבה נכונה של הקוד, וכמובן שאי אפשר בלי [...]

צבעים דינמיים ב-SSRS

כאשר לקוח שלי ולא משנה אם הוא מבוסס אורקל או SQL Server חושב על פתרון Reporting אני ישר מציע לו את ה- Sql Server Reporting Services. שתי סיבות עיקריות להצעה שלי: רישוי ויכולות. איתי בנימין מסביר על צבעים דינמים [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: