2013-03-13 18 views
5

Ho una colonna nella mia tabella che viene indicizzata in contesto.Oracle Contains non funziona

CREATE INDEX CIDX_MUSTFIXBY ON TABLE 
    (MUST_FIX_BY) 
INDEXTYPE IS CTXSYS.CONTEXT 
NOPARALLEL; 

e sto cercando una query con cui condizione

E must_fix_by LIKE 'Q2%'

e che restituisce le righe.

Tuttavia quando provo query con cui condizione

e contiene (must_fix_by, 'Q2')> 0

e non restituisce alcuna riga.

Qualcuno può dirmi perché mi piace lavorare e contiene no?

+0

Cosa stai cercando di ottenere con la seconda query? Vuoi un conteggio (contiene (must_fix_by, 'Q2'))> 0 per scoprire quanti record contengono quella stringa? – thursdaysgeek

+0

Desidero che la query restituisca tutte le righe con Q2 in must_fix_by. So che posso andare con LIKE, ma voglio sapere perché contiene non funziona. – Jeevan

+0

Oh, scusa, ho letto la domanda sbagliata. – thursdaysgeek

risposta

5

Due possibili motivi: l'indice potrebbe non essere sincronizzato e CONTAINS sembra corrispondere alle parole mentre LIKE corrisponde alle stringhe.

Un esempio di due stringhe, dove LIKE partite entrambi, ma CONTAINS partite né:

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 

Per impostazione predefinita, CONTEXT indici hanno bisogno di essere manually synchronized. È necessario eseguire: exec ctx_ddl.sync_index('cidx_mustfixby'); oppure è necessario creare l'indice 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 

Questo risolve uno dei problemi. Ma Q234567 non è ancora abbinato. Non so molto su Oracle Text e non riesco nemmeno a trovare una semplice descrizione di come funziona CONTAINS. Ma sembra essere basato su parole complete invece che su stringhe. Deve esserci una sorta di limite di parole tra il secondo e gli altri caratteri perché venga prelevato da un semplice filtro CONTAINS.

+0

Grazie jonearles – Jeevan

Problemi correlati