物化视图中的域索引返回零行

时间:2016-11-29 11:18:25

标签: oracle indexing materialized-views

我有Oracle DB的问题 - 在物化视图上通过CONTAINS()搜索后,域索引返回零行。我看到物化视图充满了数据,我还使用过程ctx_ddl.sync_index()进行域索引同步。

什么行之有效:

  • CREATE TABLE
  • INSERT DATA
  • 创建域名索引
  • SYNC DOMAIN INDEX
  • 通过包含找到行 - 返回行

什么不行:

  • CREATE TABLE
  • INSERT DATA
  • 创建物质化视图
  • REFRESH MATERIALIZED VIEW
  • 在物化视图中创建域索引
  • 物化视图中的同步域索引
  • 在物质化视图中找到行列 - 返回零行(比如%TME%工作)

为什么一切正常而没有物化视图? 这是我的查询(您可以在oracle db中复制粘贴并尝试它):

--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

1 个答案:

答案 0 :(得分:0)

Oracle Text索引通常搜索单词,而不是字符串。

在“Martin Luther King Jr.”中搜索“martin”不需要通配符。但是在“MARTINKO3”中搜索“martin”需要使用通配符

CONTAINS谓词更改为:

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

我在Oracle 12.2上运行测试,但在使用表或物化视图之间的行为方面没有发现任何差异。也许有一个测试错误或一个非常具体的错误导致文本索引在您的系统上采取不同的行为。