среда, 1 июня 2011 г.

Контекстный поиск


   Как-то столкнулся я с новой для меня задачей, реализовтаь контектный поиск внутри Oracle.
   На русском языке Google сходу выдаёт одну статью, которая конечно помогла мне, но в ней не было по шагам написано что надо сделать, чтобы всё заработало. поэтому здесь я будет краткая справка о том что делать и куда бежать. По сути - это будет пересказ оракловой статьи - Getting Started with Oracle Text.

  1. Добавляем пользователю, который будет работать с пакетом ctx_ddl роль ctxapp.GRANT ctxapp TO myuser;
  2. Дать нашему пользователю гранты на выполнение функций, которые находятся в пакетах, которые относятся к Oracle Text. Следующий код даст гранты на все пакеты OT.
    GRANT EXECUTE ON CTXSYS.CTX_CLS TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_DDL TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_DOC TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_QUERY TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_REPORT TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_THES TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO myuser;
   Подготовка окончена, теперь переходим к созданию таблиц и заполнения их данными и строим индекс.
  1. Создаём таблицу:REATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));
  2. Вставляем в таблицу данные:INSERT INTO docs VALUES(1, '<HTML>California is a state in the US.</HTML>');
    INSERT INTO docs VALUES(2, '<HTML>Paris is a city in France.</HTML>');
    INSERT INTO docs VALUES(3, '<HTML>France is in Europe.</HTML>');
  3. Строим индекс:CREATE INDEX idx_docs ON docs(text)
        INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
        ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
   Теперь выполняем запрос:
SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;

 SCORE(1)         ID TEXT
---------- ---------- ----------------------------------------
        4          3 <HTML>France is in Europe.</HTML>
        4          2 <HTML>Paris is a city in France.</HTML>

   Хочу заметить, что данный пример покрывает только наипростейший контекстный индекс и контекстный поиск. В следующем посте я напишу как создавать контекстный индекс, основанный на функции. Это гораздо полезней.

Комментариев нет:

Отправить комментарий