首页 文章

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

提问于
浏览
4

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

What works good:

  • CREATE TABLE

  • 插入数据

  • 创建域索引

  • 同步域索引

  • 通过包含找到行 - 返回行

What is not working:

  • CREATE TABLE

  • 插入数据

  • 创建物化视图

  • REFRESH MATERIALIZED VIEW

  • 在物化视图中创建域索引

  • 在物化视图中的同步域索引

  • 在物质化的视图中找到行 - RETURN ZERO ROWS (比如%TERM%工作)

如果没有物化视图,为什么一切正常?这是我的查询(您可以复制粘贴并在您的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

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

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

    CONTAINS 谓词更改为:

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

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

相关问题