sql >> Base de Datos >  >> RDS >> Oracle

Oracle contiene no funciona

Dos posibles motivos:es posible que el índice no esté sincronizado y CONTAINS parece coincidir con las palabras mientras LIKE coincide con cadenas.

Un ejemplo de dos cadenas, donde LIKE coincide con ambos, pero CONTAINS no coincide con ninguno:

create table test1(must_fix_by varchar2(4000));
create index cidx_mustfixby on test1(must_fix_by) indextype is ctxsys.context;
insert into test1 values('Q234567');
insert into test1 values('Q2 234567');
select * from test1 where must_fix_by like 'Q2%';

MUST_FIX_BY
-----------
Q234567
Q2 234567

select * from test1 where contains(must_fix_by, 'Q2') > 0;

no rows selected

De forma predeterminada, CONTEXT los índices deben sincronizarse manualmente . Debe ejecutar:exec ctx_ddl.sync_index('cidx_mustfixby'); , o necesita crear su índice con on commit .

exec ctx_ddl.sync_index('cidx_mustfixby');
select * from test1 where contains(must_fix_by, 'Q2') > 0;

MUST_FIX_BY
-----------
Q2 234567

Esto soluciona uno de los problemas. Pero Q234567 todavía no está emparejado. No sé mucho sobre Oracle Text, y ni siquiera puedo encontrar una descripción simple de cómo CONTAINS obras. Pero parece estar basado en palabras completas en lugar de cadenas. Tiene que haber algún tipo de límite de palabra entre Q2 y otros caracteres para que pueda ser recogido por un simple CONTAINS filtro.