2013-03-13 18 views
5

Tablomda bağlam dizinli bir sütun var.Oracle İçindekiler çalışmıyor

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

Ve koşulu

VE

LIKE 'Q2%' must_fix_by nerede ile bir sorgu çalışıyorum ve satır döndürür.

Ancak ben koşulu

VE (must_fix_by, 'Q2')> 0

terimi içeren ile sorgu denediğinizde ve tüm satırları döndürmez.

Birisi lütfen bana niçin çalıştığını ve içerdiği gibi olmadığını söyler misiniz?

+0

İkinci sorguyla ne elde etmeye çalışıyorsunuz? Bu dizeyi kaç kayıt içerdiğini öğrenmek için bir sayım (içerir (must_fix_by, 'Q2'))> 0 mı? – thursdaysgeek

+0

Sorgunun, must_fix_by dosyasında Q2 olan tüm satırları döndürmesini istiyorum. Biliyorum GİBİ ile gidebilirim ama neden içerdiğini bilmek istiyorum. – Jeevan

+0

Oh, pardon, yanlış olanı okudum. – thursdaysgeek

cevap

5

İki olası neden - dizin eşitlenmeyebilir ve CONTAINS sözcüklerle eşleşirken, LIKE dizeleri eşleşiyor.

LIKE maçlar hem fakat CONTAINS maçlar ne iki dizeleri, bir örnek: Varsayılan olarak

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 indeksleri manually synchronized olmak gerekir. Ya koşmanız gerekiyor: exec ctx_ddl.sync_index('cidx_mustfixby');, ya da on commit ile dizin oluşturmalısınız.

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

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

Bu, sorunlardan birini giderir. Ancak Q234567 hala eşleşmiyor. Oracle Text hakkında pek bir şey bilmiyorum ve CONTAINS'un nasıl çalıştığına dair basit bir açıklama bile bulamıyorum. Ama diziler yerine tam kelimelere dayanıyor gibi görünüyor. Basit bir CONTAINS filtresi ile alınacak Q2 ve diğer karakterler arasında bir kelime sınır olması gerekir.

+0

Teşekkür ederim jonearles – Jeevan