الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Oracle text index ?

مغلق
بدأه HomeSick في 25 مايو 2006 · 7 رد · 816 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل هناك أحد من الأخوة يعرف عن Oracle text indexing ؟؟

في مشكلة واجهتني باستخدامي للاوراكل text index .. وهي ان فكرة البحث باستخدام هذه الطريقة عملت بشكل ممتاز وسليم على المدخلات التي كانت موجودة قبل انشاء ال text index

ولكن لما أضفت سطر جديد للجدول .. لا يقوم ال index بالبحث في المدخل الجديد لماذا ؟؟

يعني ال text index فقط يبحث في السطور التي كانت موجودة وقت انشائه ؟؟

وأرجوكم اللي عنده فكرة للموضوع .. يفيدنا

وجزاكم الله خيرا ً ..

#2

برجاء وضع الكود لاكتشاف الخطاء

#3

وهذا الكود من لحظة انشاء الجدول الى انشاء ال index

CREATE USER text_user IDENTIFIED BY oracle;
GRANT connect, resource, ctxapp TO text_user;

CONN text_user/oracle

CREATE TABLE songs (
     ID         NUMBER(10),
     Title      VARCHAR2(50),
     Genre      VARCHAR2(50)
);

INSERT INTO songs (ID, Title, Genre)
   VALUES (1, 'The Preble Mice Go Squeak', 'CHILD');
INSERT INTO songs (ID, Title, Genre)
   VALUES (2, 'Benri The Cat', 'CHILD');
INSERT INTO songs (ID, Title, Genre)
   VALUES (3, 'My Mouse Won't Work Blues', 'COMPUTER ENGINEER');
INSERT INTO songs (ID, Title, Genre)
   VALUES (4, 'My Pen Leaked - Ballad Of The Pocket Protector', 'COMPUTER ENGINEER');
INSERT INTO songs (ID, Title, Genre)
VALUES (5, 'The Mechanical Pencil - Get The Lead Out', 'HEAVY METAL');
COMMIT;

this code to create the preferences

BEGIN CTX_DDL.CREATE_PREFERENCE(
'english_lexer','basic_lexer');

CTX_DDL.SET_ATTRIBUTE(
'english_lexer','index_themes',
'no');
END;
/

Now to create the index

CREATE INDEX song_index ON songs(title)
  INDEXTYPE IS CTXSYS.CONTEXT
  PARAMETERS('LEXER english_lexer 
    STOPLIST ctxsys.default_stoplist');

Now to test the index we use like this

SELECT score(1), title, genre
FROM songs WHERE CONTAINS(title, 'mice', 1) > 0;

الآن ال index شغال تمام مع الجدول الموجود والمدخلات الموجودة

لكن المشكلة لو ضفت مدخل جديد للجدول .. ال index ما راح يبحث فيه .. كأن ال index فقط شغال مع المدخلات التي كانت موجودة وقت انشاءه وهي الخمس صفوف في مثالي السابق

يا ترى الحل ما هو ؟؟ كيف أجعل ال index داينامك ويقوم بالبحث كذلك في الصفوف الجديدة

هذا ما أرجو المساعدة فيه :)

ودمتم بود

#4

بما أنك أستخدمت context فيجب عليك بناء index كلما أدخلت بيانات جديدة أي يجب عليك تنفيذ تعليمة

alter index index_name rebuild;

و هذه عملية صعبة جداً ...

يمكنك إستخدام نوع آخر و هو CTXCAT و هو يساعدك على عملية التزامن بين الجدةل و الفهرس ...

CREATE INDEX song_index ON songs(title)
INDEXTYPE IS CTXSYS.CTXCAT;
#5

أخي العزيز informat

أشكرك أخي على المتابعة والرد

أستخدمت أخي النوع CTXSYS.CTXCAT في انشاء ال index .. لكن المشكلة هي أني عندما أعمل استعلام معين يعطيني هذا ERROR

لكن اتل

SQL>  SELECT score(1), TITLE
  2   FROM SONGS
  3   WHERE CONTAINS(TITLE, 'CAR', 1) > 0
  4  /
 SELECT score(1), TITLE
*
ERROR at line 1:
ORA-20000: Oracle Text error:
DRG-10599: column is not indexed

مع اني متأكد اني أنشأت ال INDEX حتى حاولت أنشأه مرة ثانية اعطاني ERROR أن ال INDEX على العمود ALREADY EXISTED

فما هو الحل برأيك

وجزاك الله خيرا ً

#6

هل تنشأ Index على title ?

لا تنسى أن تجعل title مفتاح أساسي

#7

أخي الكريم شكرا ً على المتابعة

حلت قضيتي باستخدامي التالي

SELECT title FROM songs WHERE CATSEARCH(title, '"father"',NULL)> 0;

سلمت أخي الكريم على جهودك الرائعة معي

دمت بكل ود :)

تم تعديل هذه المشاركة بواسطة HomeSick في 29 مايو 2006 في 03:03

#8

بالتوفيق أخي

هذا الموضوع مغلق.

مواضيع مشابهة