آموزش oracle full text search

آموزش oracle full text search

Context Cartridge, interMedia Text, Oracle Text

تمام این مفاهیم یکی هستند. Context Cartridge برای Oracle8.0.x و interMedia در Oracle8i و Oracle Tex از نسخه Oracle9i به بعد استفاده می شود.

Oracle Text چیست؟

Oracle Text قسمتی از اوراکل است که در نسخه Standard و Enterprise وجود دارد.Oracle Text برای Index کردن, جستجو کردن, آنالیز متن و ذخیره مستندات در بانک اطلاعاتی اوراکل , در فایل و در وب از SQL استاندارد استفاده می کند. Oracle Text می تواند مستندات را آنالیزکند و با روشهای مختلف شامل کلمه کلیدی, عملگرهای منطقی (AND, OR) متن های با فرمت و بدون فرمت یا حتی متن HTML/XML را جستجو کند. Oracle Text زبانهای مختلف از جمله فارسی, ژاپنی, کره ای, چینی را پشتیبانی می کند.

interMedia چیست؟

interMedia تمامی خصوصیات و توابع قبلی اوراکل با محصولات تصویر, صوت, فیلم و سرویسهای موقعیت جغرافیایی را برای برنامه های کاربردی Web Content Management با Oracle8i Internet Platform یکپارچه می کند.معماری interMedia در اوراکل ۸i بطور کامل تکمیل شده است تا با بالاترین یکپارچگی و بهبود بتواند جستجو را بهتر انجام دهد واستفاده از آن آسان باشد و دارای قابلیت جدید جستجوی ریشه ای است منظورجستجو مربوط به موضوع است.

روش راه اندازی در Oracle Database 11g R2

ابتدا باید Oracle Text را نصب کرده باشید. می توانید آنرا به دو شکل گرافیکی یا بطور دستی با اجرای Script های لازم نصب کنید .

الف: گرافیکی

اگر بصورت گرافیکی می خواهید نصب کنید از دستور dbca استفاده کنید. سیستم عامل مهم نیست ویندوز و یا لینوکس باشد یک command prompt در ویندوز و یا یک ترمینال در محیطهای لینوکس و یا یونیکس باز کنید وبا کاربر oracle دستور dbca را اجرا کنید.

۱کلیک Next

۲- قسمت ”Configure Database Option” را انتخاب کنید.

۳سپس نام database را انتخاب کنید.

۴درپنجره ای که configure Enterprise Manager را نشان میدهد بدون تغییردکمه Next را بزنید

۵گزینه ”Oracle Text” را انتخاب کنید و سپس دکمه Next را بزنید

۶دکمه Next را بزنید تا به دکمه Finish برسید.

ب: روش دستی

با کاربر SYS و برنامه SQL Plus به بانک اوراکل وصل شوید.

$ sqlplus / as sysdba

SQL> connect / as SYSDBA
SQL> spool ctxsys_installation.log

SQL> @?/ctx/admin/catctx.sql   password  SYSAUX TEMP NOLOCK

SQL> connect CTXSYS/ password
SQL> @?/ctx/admin/defaults/dr0defin.sql “AMERICAN”;

SQL> connect / as SYSDBA
SQL> alter user ctxsys account lock password expire;

SQL> spool off

ORACLE_HOME$ :محل نصب اوراکل را نشان می دهد

password : رمز عبور دلخواه برای کاربر ctxsys می باشد .

SYSAUX : نام tablespace sysaux است.

Temp : نام temporary tablespace است.

NOLOCK : کاربر ctxsys را لاک نکن

آزمایش صحت نصب

SQL> select comp_name, status, substr(version,1,10) as version from dba_registry where comp_id = ‘CONTEXT’;

COMP_NAME STATUS VERSION
——————- ——– ———-
Oracle Text VALID 11.2.0.1.0

SQL> select * from ctxsys.ctx_version;

VER_DICT VER_CODE
———- ———-
۱۱٫۲٫۰٫۱٫۰ ۱۱٫۲٫۰٫۱٫۰

SQL> select substr(ctxsys.dri_version,1,10) VER_CODE from dual;

VER_CODE
———-
۱۱٫۲٫۰٫۱٫۰

SQL> select count(*) from dba_objects where owner=’CTXSYS’;

COUNT(*)
———-
۳۶۶

نحوه حذف oracle Text

SQL> connect / as SYSDBA
SQL> spool ctxsys_removal.log

SQL> @?/ctx/admin/catnoctx.sql

SQL> spool off

مثال قدم به قدم

برای درک بیشتر و بهتر با یک مثال قدم به قدم آن راتوضیح میدهیم

۱- با کاربر Scott ورمز عبور tiger با برنامه SQL Plus به بانک اوراکل وصل شوید. یک table به شکل زیر بسازید. می توانیدScript زیر را copy and paste کنید.

Create table test (

id number (3) primary key,

text1 varchar2 (2000),

text2 clob,

text3 blob

);

insert into test

values(1,’ Oracle Text is part of the Oracle9i Standard and Enterprise Editions’,’ pattern matching, mixed thematic queries, HTML/XML section searching’, null);

insert into test

values(2,’ Oracle Text can perform linguistic analysis on documents’,’ Content-based retrieval on free text with both literal (word) predicates and thematic predicates’, null);

insert into test

values(3,’ interMedia integrates all of the features and functions of the former Oracle ConText product with image’, null);

commit;

برای وارد کردن اطلاعات برای فیلد text3 از برنامه های Sqldeveloper, PL Sqldeveloper, Toad استفاده کنید.

و فایل word ای که دارای متن پارسی باشد را آپلود کنید.

جستجوهای ConText

از اوراکل ۷٫۳ می توانید ConText را برای جستجوی متن به صورت قسمتی از Query بانک اوراکل بکار برید.جستجوی متن در اوراکل از طریق پردازش سرور در کنار پردازش Oracle background پیاده سازی می شود. یکبار متن باید روی فیلدی که اطلاعات را ذخیره می کند ایند کس شود.

جستجوی یک عبارت بطور دقیق

برای جستجوی دقیق یک عبارت از تساوی استفاده می کنیم.

select id from test where text1 = ‘ Oracle Text is part of the Oracle9i Standard and Enterprise Editions ‘;

جستجوی متن که شامل یک عبارت است

برای این کار از کلمه LIKE استفاده می کنیم. رکوردهایی که شامل کلمه Oracle است را برمی گرداند.

select id from test where text1 like ‘%Oracle%’;

که نتیجه آن به شکل زیر است.

ID

———-

۱

۲

۳

حال یک جستجوی دیگر. رکوردهایی که شامل کلمه Text است را برمی گرداند.

select id from test where text1 like ‘%Text%’;

همانطور که مشاهده می کنید اگر فیلد از نوع varchar2 باشد می توانیم با دستور like دنبال متن بگردیم. حال یک جستجوی دیگر روی فیلدهای دیگر انجام دهید. مثلا روی فیلد text2 و فیلد text3

select id from test where text2 like ‘% document%’;

اگر از اوراکل ۸ و ۸iا استفاده می کنید اشکال زیر را خواهید دید.

text2 like ‘%Text%’

ERROE at line 1:

ORA-00932: inconsistent datatypes

ولی در نسخه اوراکل ۹i به بالا برای نوع CLOB مقدار id =3 را پیدا می کند

select id from test where text2 like ‘%Text%’

راهکار

برای اینکه که بتوانیم روی فیلدها از نوع LONG و CLOBجستجو داشته باشیم باید مراحل زیر را انجام داد.

با کاربر CTXSYS به بانک اوراکل وصل شوید و دستور زیر را اجرا کنید. با این دستور مجوز نقش CTXAPP را به کاربر SCOTT می دهید.

SQL> connect ctxsys/password

SQL> grant ctxapp to scott;

دوباره با کاربر scott به اوراکل وصل شوید. باید روی فیلدها از نوع BLOB و CLOB ایندکس بسازیم برای این کار از دستور زیر را استفاده می کنیم.

SQL> connect scott/tiger

SQL> CREATE INDEX index_name ON table_name(field_name) INDEXTYPE IS CTXSYS.CONTEXT;

SQL> CREATE index idx_test_clob on test(txt1) indextype is ctxsys.context PARAMETERS(‘SYNC(ON COMMIT) MEMORY 20M’);

SQL> CREATE index idx_test_clob on test(txt2) indextype is ctxsys.context PARAMETERS(‘SYNC(ON COMMIT) MEMORY 20M’);

CREATE index idx_test_clob on test(txt3) indextype is ctxsys.context PARAMETERS(‘SYNC(ON COMMIT) MEMORY 20M’);

حال برای جستجو باید به طریق زیر عمل کنید.

SQL> select ID from test where contains (text1, ‘Text’) > 0;

SQL> select ID from test where contains (text2, ‘Text’) > 0;

SQL> select ID from test where contains (text3, ‘Text’) > 0;

به جای دستور Like باید از Contains استفاده کنیم.که دو تا پارامتر می گیرد. یکی نام فیلدی که روی آن Index ایجاد کردیم و دیگری کلمه ای که می خواهیم داخل متن پیدا کنیم.

تابع Contains به پروسه ConText سرور اعلان می کند که ایندکس متن را برای فیلدهای text1, text2, text3 آزمایش کند.اگر کلمه Text را پیدا کرد یک نمره (Score) بزرگتر از صفر برمی گرداند. Score یک ارزیابی است که نشان می دهد که رکورد واکشی شده چقدر با ضابطه مشخصه شده تابع Contains تطابق دارد. علامت < در تابع Contains عملگر threshold نامیده می شود.

وقتی که جستجوی متن انجام شد ConText مقدار Score را محاسبه می کند وanalysis threshold نتیجه محاسبه را با مقدار تعیین شده threshold مقایسه می کند. مقدار Score برای جستجوهای فردی بین ۰ تا ۱۰ است. حتی می توانید مقدار Score را در عبارت جستجو بیاورید.

Select id, score(10)

From test

Where contains(text3,’Text’, 10) > 0;

تابع Score را می توانید در SELECT , GROUP BY , ORDER BY بکار برید.

مثال دیگر:

select id

from test where contains (text3, ‘features’) > 0;

عملگرهای منطقی ( AND, OR)یا (&, |)

برای جستجو بیش از یک کلمه می توانید از عملگرها استفاده کنید.مثلا اگر می خواهید دو کلمه featuresو Text با هم در متن وجود داسته باشد از عملگر AND یا & استفاده می کنیم یا اگر می خواهید یکی از آنها در متن وجود داشت ؛ پیدا شود از عملگر OR یا | استفاده کنید. به مثال زیر نگاه کنید.

select id from test where contains (text3, ‘features AND Text’) > 0;

select id from test where contains (text3, ‘features & Text’) > 0;

select id from test where contains (text3, ‘features OR Text’) > 0;

select id from test where contains (text3, ‘features | Text’) > 0;

عملگر ACCUM یا کاما ,

select id from test where contains (text3, ‘features ACCUM Text’) > 0;

select id from test where contains (text3, ‘features , Text’) > 0;

عملگر ACCUM روشی دیگری را برای جستجو استفاده می کند. ACCUM ابتدا Score هر جستجو را به صورت تکی بدست می آورد برای کلمه features جداگانه و برای کلمه Text جداگانه Score را حساب کرده و آنها را با هم جمع کرده و با مقدار threshold مقایسه می کند.

عملگر MINUS یا –

select id from test where contains (text3, ‘features MINUS Text’) > 0;

select id from test where contains (text3, ‘features – Text’) > 0;

عملگر MINUS نتیجه Score دومین جستجو (Text) را از Score اولین جستجو(features) کم می کند و سپس نتیجه را بر می گرداند.

عملگر NEAR یا ;

select id from test where contains (text3, ‘languages NEAR including’) > 0;

select id from test where contains (text3, ‘languages ; including’) > 0;

select id from test where contains (text3, ‘چک پول‘) > 0;

عملگر NEAR عبارتهای نزدیک به هم را پیدا می کند.در مثال بالا رکوردهایی را پیدا کند که در آنها کلمه including نزدیک به کلمه languages است.

و یا در متن دونبال وآژگان چک پول که کنار هم باشند می گردد.

عملگر *

گاهی اوقات می خواهید جستجو به شکلی باشد که Score یک کلمه بیشتر از کلمه دیگر باشد یا به اصطلاح امتیاز آن سنگین تر از دیگری باشد از عملگر * استفاده می کنیم.

select id from test where contains (text3, ‘features*2 OR Tex*1’) > 0;

دراین جستجو Score عبارت features دو برابر عبارت Text است.

عملگر {}

اگر می خواهید عملگرها مثل and یا or نیز جز متن باشد مثلا در متن جمله JSP and Java or XML وجود داشت از علامت {} استفاده می کنیم و عملگرها در داخل آن قرارمی دهیم. به مثال زیر توجه کنید.

حال مثالهای زیر را اجرا کنید.

select id from test where contains (text3, ‘JSP {and} Java’) > 0;

select id from test where contains (text3, ‘Java {or} XML’) > 0;

یا به شکل

select id from test where contains (text3, ‘{JSP and Java}’) > 0;

select id from test where contains (text3, ‘{Java or XML}’) > 0;

استفاده از Wildcardsها (% و _)

از کاراکترهای % و _ می توانید به عنوان Wildcard استفاده کنید. مثلا دنبال کلمه های lan و language

می گردید. یعنی کلمه هایی که با lan شروع می شوند.

select id from test where contains (text3, ‘lan%’) > 0;

یا دنبال کلمه engineering می گردید ولی می خواهید جستجو به شکلی باشد که تعداد کاراکتر بعد ازenginee را مشخص کنید. مثلا بعد از enginee می خواهید دو کاراکتر باشد. بنابراین دو بار از کاراکتر _ استفاده

می کنیم. به مثال زیر نگاه کنید.

select id from test where contains (text3, ‘enginee__’) > 0;

یا برای چهار کاراکتر

select id from test where contains (text3, ‘enginee____’) > 0;

عملگر $

جستجو کلماتی که دارای یک ریشه هستند .

به شکل زیر نگاه کنید.

ریشه مثال

play plays played playing playful

works working work worked workman workhorse

have had has haven’t hasn’t

می خواهید دنبال کلمه هایی دارای ریشه play هستند بگردید باید از کاراکتر $ در ابتدا و بدون فاصله استفاده کنید.

select id,text3 from test where contains (text3, ‘$play’) > 0;

و به صورت ترکیبی

select id,text3 from test where contains (text3, ‘$play or $works’) > 0;

عملگر ? یا جستجو به شکل FUZZY

در این حالت کلماتی پیدا می شوند که دارای spell یکسان هستند ولی احتیاجی نیست که دارای یک ریشه باشند. این جستجو برای متن هایی که دارای غلط املایی هستند بسیار مفید می باشد. در یکی از رکوردها به جای کلمه well اشتباهی welt تایپ شده است حال می خواهیم دنبال عبارت well بگردیم.

select id, text3 from test where contains(text3,’well’) > 0;

در این مثال هیچ رکوردی پیدا نمی شود. حال نحوه جستجو را عوض می کنیم. توجه داشته باشید که بعد از عملگر ? نباید فاصله ای وجود داشته باشد.

select id, text3 from test where contains(text3,’?well’) > 0;

این مثال رکوردی که شامل عبارت welt است را برمی گرداند.

عملگر ! یا SOUNDEX

جستجوی کلماتی که دارای یک صدا هستند. به مثالهای زیر نگاه کنید.

کلمات smite با smith و two با too هم صدا می باشند وقتی هر کدام از آنها را جستجو می کنید کلمه دیگر نیز پیدا می شود.

select id,text3 from test where contains(text3,’!smite’) > 0;

select id,text3 from test where contains(text3,’!smith’) > 0;

select id,text3 from test where contains(text3,’!too’) > 0;

select id,text3 from test where contains(text3,’!two’) > 0;

با دستور SOUNDEX در مثال زیر می بینید که مقادیر SOUNDEX یکسان دارند.

select soundex(‘smite’) smite, soundex(‘smith’) smith from dual;

ترکیب عملگرها و استفاده از ()

select id from test where contains (text3, ‘(features AND Text) OR languages’) > 0;

select id,text3 from test where contains(text3,’$?amite’) > 0;

select id,text3 from test where contains(text3,'($engineering AND !smite MINUS smith)’) > 0;

تمامی مثالها را می توانید با محتوی پارسی آزمایش کنید ولی بیشتر آنها استفاده نمی شود.

خلاصه عملگرهای موجود در جستجوی ConText

توضیح

عملگر

رکوردی پیدا می شود که Score عبارت مورد جستجو آن بیشتر ازthreshold است

OR

مثل OR

|

رکوردهایی پیدا می شوند که هر دو عبارت مورد جستجو Score بیشتر از threshold باشند

AND

مثل AND

&

رکوردی واکشی می شود که جمع هردو عبارت مورد جستجو بیشتر از threshold باشد

ACCUM

مثل ACCUM

,

رکوردی واکشی می شود که تفاضل Score عبارت اول از دوم بیشتر از threshold باشد

MINUS

مثل MINUS

سنگینی عبارت مورد جستجو را مشخص می کند

*

عبارت نزدیک به هم را پیدا می کند

NEAR

مثل NEAR

;

اگر کلمات رزرو شده مثل AND جزء جستجو باشند را داخل این علامت قرار می دهیم

{}

Multiple-character Wildcard

%

Single-character Wildcard

_

رکوردهایی پیدا می شوند که عبارت مورد جستجو دارای یک ریشه هستند

$

در این حالت جستجو کلماتی پیدا می شوند که دارای spell یکسان هستند

?

جستجوی کلماتی که دارای یک صدا هستند جستجو می شوند

!