2013-03-13 13 views
5

Mam kolumnę w mojej tabeli, która jest kontekstowana.Oracle Contains nie działa

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

i próbuję kwerendy z którym warunek

I must_fix_by LIKE '%' Q2

i zwraca wiersze.

Jednak gdy próbuję kwerendy z którym warunek

i zawiera (must_fix_by, 'Q2')> 0

i nie zwraca żadnych wierszy.

Czy ktoś może mi powiedzieć, dlaczego tak działa i zawiera nie jest?

+0

Co próbujesz osiągnąć przy drugim zapytaniu? Czy chcesz count (zawiera (must_fix_by, 'Q2'))> 0, aby dowiedzieć się, ile rekordów zawiera ten ciąg? – thursdaysgeek

+0

Chcę, aby zapytanie zwróciło wszystkie wiersze mające Q2 w must_fix_by. Wiem, że mogę pójść z LIKE ale chcę wiedzieć, dlaczego zawiera nie działa. – Jeevan

+0

Och, przepraszam, źle przeczytałem pytanie. – thursdaysgeek

Odpowiedz

5

Dwie możliwe przyczyny - indeks może nie być zsynchronizowany, a CONTAINS wydaje się pasować do słów, podczas gdy LIKE dopasowuje ciągi.

Przykładem dwóch ciągów, gdzie LIKE mecze obu, ale CONTAINS mecze Zarówno:

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 

Domyślnie CONTEXT indeksy muszą być manually synchronized. Musisz uruchomić: exec ctx_ddl.sync_index('cidx_mustfixby');, lub musisz utworzyć indeks z numerem on commit.

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

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

Rozwiązuje to jeden z problemów. Ale Q234567 nadal nie jest dopasowany. Nie wiem zbyt wiele o Oracle Text i nie mogę nawet znaleźć prostego opisu, jak działa CONTAINS. Ale wydaje się być oparte na pełnych słowach zamiast ciągów. Pomiędzy Q2 i innymi znakami musi znajdować się granica słowa , która ma zostać odebrana przez prosty filtr CONTAINS.

+0

Dziękuję jonearles – Jeevan

Powiązane problemy