2016-11-29 38 views
4

我遇到Oracle DB問題 - 在實例化視圖上的CONTAINS()搜索後,域索引返回零行。我看到物化視圖充滿了數據,我還使用過程ctx_ddl.sync_index()進行域索引同步。實例化視圖中的域索引返回零行

什麼工作好:

  • CREATE TABLE
  • 插入數據
  • CREATE DOMAIN INDEX
  • SYNC域索引
  • 查找行方式包含 - 返回行

什麼不工作:

  • CREATE TABLE
  • 插入數據
  • CREATE MATERIALIZED VIEW
  • REFRESH MATERIALIZED VIEW
  • CREATE DOMAIN指數的物化視圖
  • 同步域指數的物化視圖
  • 查找包含物化視圖的行 - 返回零行(%%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 Text索引通常搜索的話,而不是字符串。

在「Martin Luther King Jr.」中搜索「martin」不需要通配符。但通配符搜索「MARTINKO3」中的「martin」所必需的。

CONTAINS謂詞改成這樣:

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

我跑甲骨文12.2測試和無法找到行爲使用一個表或物化視圖之間的差異。也許有一個測試錯誤或一個非常具體的錯誤,導致文本索引在您的系統上採取不同的行爲。