2013-03-13 28 views
5

Tôi có một cột trong bảng của tôi là ngữ cảnh được lập chỉ mục.Oracle Contains không hoạt động

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

Và tôi đang cố gắng một truy vấn với nơi mà điều kiện

VÀ must_fix_by LIKE 'Q2%'

và nó trả hàng.

Tuy nhiên khi tôi cố gắng truy vấn với nơi mà điều kiện

VÀ chứa (must_fix_by, 'Q2')> 0

và nó không trả lại bất kỳ hàng.

Ai đó có thể cho tôi biết lý do tại sao như đang hoạt động và chứa không?

+0

Bạn đang cố gắng đạt được gì với truy vấn thứ hai? Bạn có muốn đếm (chứa (must_fix_by, 'Q2'))> 0 để tìm xem có bao nhiêu bản ghi chứa chuỗi đó? – thursdaysgeek

+0

Tôi muốn truy vấn trả về tất cả các hàng có Q2 trong must_fix_by. Tôi biết tôi có thể đi với LIKE nhưng tôi muốn biết tại sao có chứa không hoạt động. – Jeevan

+0

Ồ, xin lỗi, tôi đã đọc sai câu hỏi. – thursdaysgeek

Trả lời

5

Hai lý do có thể - chỉ mục có thể không được đồng bộ hóa và CONTAINS dường như đối sánh các từ trong khi LIKE chuỗi phù hợp.

Một ví dụ về hai chuỗi, nơi LIKE trận đấu cả hai, nhưng CONTAINS trận không:

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 

Theo mặc định, CONTEXT chỉ số cần phải được manually synchronized. Bạn cần chạy: exec ctx_ddl.sync_index('cidx_mustfixby'); hoặc bạn cần tạo chỉ mục của mình với on commit.

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

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

Điều này khắc phục một sự cố. Nhưng Q234567 vẫn chưa khớp. Tôi không biết nhiều về Oracle Text, và tôi thậm chí không thể tìm thấy một mô tả đơn giản về cách hoạt động của CONTAINS. Nhưng nó dường như được dựa trên các từ đầy đủ thay vì các chuỗi. Cần có một số loại ranh giới từ giữa Q2 và các ký tự khác để nó được chọn bằng một bộ lọc CONTAINS đơn giản.

+0

Cảm ơn bạn jonearles – Jeevan

Các vấn đề liên quan