Hai lý do có thể xảy ra - chỉ mục có thể không được đồng bộ hóa và CONTAINS
dường như khớp với các từ trong khi LIKE
khớp với các chuỗi.
Ví dụ về hai chuỗi, trong đó LIKE
khớp với cả hai, nhưng CONTAINS
không phù hợp với:
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ỉ mục cần được đồng bộ hóa theo cách thủ công
. Bạn cần chạy:exec ctx_ddl.sync_index('cidx_mustfixby');
hoặc bạn cần tạo chỉ mục cho mình bằng 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 trong những vấn đề. Nhưng Q234567
vẫn chưa khớp. Tôi không biết nhiều về Oracle Text và thậm chí tôi không thể tìm thấy một mô tả đơn giản nào về cách CONTAINS
làm. Nhưng nó dường như dựa trên các từ đầy đủ thay vì chuỗi. Cần phải 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 CONTAINS
đơn giản bộ lọc.