我有Oracle DB的问题 - 在物化视图上通过CONTAINS()搜索后,域索引返回零行。我看到物化视图充满了数据,我还使用过程ctx_ddl.sync_index()进行域索引同步。
什么行之有效:
什么不行:
为什么一切正常而没有物化视图? 这是我的查询(您可以在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
答案 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上运行测试,但在使用表或物化视图之间的行为方面没有发现任何差异。也许有一个测试错误或一个非常具体的错误导致文本索引在您的系统上采取不同的行为。