2013-03-13 2 views
5

У меня есть столбец в моей таблице, индексированный контекстом.Oracle Contains не работает

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

И я пытаюсь запрос с условием, где

И must_fix_by LIKE '%' Q2

и возвращает строки.

Однако при попытке запроса с условием, где

И содержит (must_fix_by, 'Q2')> 0

и не возвращает ни одной строки.

Может кто-нибудь, пожалуйста, скажите мне, почему, как работает и содержит нет?

+0

Что вы пытаетесь достичь со вторым запросом? Вы хотите подсчет (содержит (must_fix_by, 'Q2'))> 0, чтобы узнать, сколько записей содержит эту строку? – thursdaysgeek

+0

Я хочу, чтобы запрос возвращал все строки с Q2 в must_fix_by. Я знаю, что могу пойти с LIKE, но я хочу знать, почему содержит не работает. – Jeevan

+0

О, извините, я неправильно прочитал этот вопрос. – thursdaysgeek

ответ

5

Возможны две причины: индекс не может быть синхронизирован, и CONTAINS, похоже, соответствует словам, а LIKE соответствует строкам.

Пример из двух строк, где LIKE матчи оба, но CONTAINS матчи ни:

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 

По умолчанию CONTEXT индексы должны быть manually synchronized. Вам либо нужно запустить: exec ctx_ddl.sync_index('cidx_mustfixby');, либо вам нужно создать индекс с on commit.

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

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

Это исправление одной из проблем. Но Q234567 все еще не соответствует. Я не очень много знаю об Oracle Text, и я даже не могу найти простое описание того, как работает CONTAINS. Но, похоже, он основан на полных словах вместо строк. Должна быть какая-то граница слова между Q2 и другими символами, чтобы ее можно было подобрать простым фильтром CONTAINS.

+0

Спасибо, джонэрлес – Jeevan

Смежные вопросы