2016-11-29 5 views
4

У меня проблема с Oracle DB - индекс домена возвращает нулевые строки после поиска CONTAINS() на материализованном представлении. Я вижу, что материализованное представление заполнено данными, и я также использовал процедуру ctx_ddl.sync_index() для синхронизации индекса домена.Индекс домена в материализованном представлении возвращает нулевые строки

Что хорошо работает:

  • CREATE TABLE
  • INSERT DATA
  • создать домен INDEX
  • SYNC DOMAIN INDEX
  • найти строки BY СОДЕРЖИТ - ВОЗВРАТ РЯДЫ

Что не работает:

  • CREATE TABLE
  • INSERT DATA
  • CREATE материализованное представление
  • ОБНОВЛ MATERIALIZED VIEW
  • CREATE DOMAIN INDEX IN MATERIALIZED VIEW
  • SYNC DOMAIN INDEX IN MATERIALIZED VIEW
  • НАЙТИ ВЕЩЕСТВА, СОДЕРЖАЩИЕСЯ В МАТЕРИАЛИЗОВАННОМ ВИДЕ - RETURN ZERO ROWS (НЕДОСТАТКИ% TERM% WORKS)

Почему все работает нормально, без материального вида? Вот мои запросы (вы можете скопировать-вставить и попробовать его в БД Oracle):

--create table CREATE TABLE "PCOUNTERPARTY" ("ID_COUNTERPARTY" NUMBER(10,0), "TXT_SEARCH_FULL_NAME" NVARCHAR2(260), CONSTRAINT "PCOUNTERPARTY_PK" PRIMARY KEY ("ID_COUNTERPARTY"));

--INSERT DATA. Insert into PCOUNTERPARTY (ID_COUNTERPARTY,TXT_SEARCH_FULL_NAME) values (1184,'MARTINKO3');

--create materialized view CREATE MATERIALIZED VIEW m_pcounterparty AS SELECT c.ID_COUNTERPARTY, CAST(c.TXT_SEARCH_FULL_NAME AS varchar2(260 CHAR)) as txt_search_full_name_all FROM PCOUNTERPARTY c;

--create domain index create index IDXM_1_pcounterparty on m_pcounterparty(TXT_SEARCH_FULL_NAME_ALL) indextype is ctxsys.context PARAMETERS ('SYNC (ON COMMIT)');

--refresh of materialized view EXECUTE DBMS_MVIEW.REFRESH('M_PCOUNTERPARTY'); --refresh of index exec ctx_ddl.sync_index('IDXM_1_pcounterparty');

--search in materialized view SELECT TXT_SEARCH_FULL_NAME_ALL from M_PCOUNTERPARTY c WHERE CONTAINS(c.TXT_SEARCH_FULL_NAME_ALL, 'martin', 1) > 0; --return ZERO and THIS IS PROBLEM --c.TXT_SEARCH_FULL_NAME_ALL LIKE '%MARTIN%';-- return rows but we want search thru CONTAINS

ответ

0

Oracle Текстовые индексы обычно поиск слов, а не строк.

Подстановочный знак не нужен для поиска «martin» в «Martin Luther King Jr.» Но подстановочный знак - это, необходимый для поиска «martin» в «MARTINKO3».

Изменение CONTAINS предикат к этому:

CONTAINS(c.TXT_SEARCH_FULL_NAME_ALL, 'martin%', 1) > 0; 

Я провел тесты на Oracle 12.2 и не может найти какие-либо различия в поведении между использованием таблицы или материализованное представление. Возможно, была ошибка теста или очень конкретная ошибка, которая заставила текстовые индексы действовать по-разному в вашей системе.