2011-10-13 42 views
6

Tôi muốn truy vấn chỉ số như x like '%abc%'Làm cách nào để tạo chỉ mục văn bản cho tìm kiếm '% abc%'?

Nếu tôi có một bảng như sau

create table t 
(
    data varchar(100) 
); 

Tôi muốn tạo ra một chỉ số để có thể làm những việc sau một cách hiệu quả:

select * from t where contains('%abc%'); 

Và điều này:

select * from t where contains('abc%'); 

I cũng muốn bảng này được cập nhật trực tiếp.

Làm cách nào để tạo chỉ mục như vậy? (Tôi có cảm giác mình cần một chỉ số ctxcat, nhưng tôi đang nhầm lẫn về những lựa chọn nào tôi cần cung cấp cho nó)

Tôi đang sử dụng Oracle 10g.

Trả lời

7

Tôi sẽ sử dụng này (thiết bạn chuẩn tối thiểu và thời gian tối đa để thích hợp giá trị)

BEGIN 
    ctx_ddl.create_preference ('FT_WL', 'BASIC_WORDLIST'); 
    ctx_ddl.set_attribute  ('FT_WL', 'substring_index', 'YES'); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_index',  'YES'); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_min_length', 1); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_max_length', 6); 
    END; 

CREATE INDEX fulltext_idx ON tmp_fulltext (fulltext) 
INDEXTYPE IS CTXSYS.CTXCAT 
PARAMETERS ('WORDLIST FT_WL') 

Các thông số được giải thích ở đây Oracle Text Reference

và xem câu hỏi này về cách quản lý làm mới và cách chỉ mục có thể không nhanh hơn quá trình quét toàn bộ với dữ liệu thẻ cao:

PL/SQL Performance Tuning for LIKE '%...%' Wildcard Queries

+1

Cảm ơn câu trả lời. Chỉ cần một vài câu hỏi: «prefix_index' là« abc% 'truy vấn và 'substring_index' cho'% abc% 'truy vấn? Và chỉ số chuỗi con theo mặc định chỉ mục tất cả các chất nền? Ngoài ra, làm cách nào để sử dụng chỉ mục này? Liệu 'chứa (col, '% abc%')' và 'chứa (col, 'abc%')' có phải là thủ thuật không? – Clinton

+0

Có những tìm kiếm đó sẽ hoạt động, đã cập nhật với liên kết có thể giải thích tốt hơn tôi, nhưng về cơ bản các thông số được sử dụng để cải thiện hiệu suất của chính xác loại tìm kiếm đó. –

0

Nhìn vào vấn đề của bạn nếu cơ sở dữ liệu của bạn là rất lớn sau đó bạn có thể sử dụng Sphinx Search

Sphinx là một mã nguồn mở máy chủ tìm kiếm toàn văn bản, được thiết kế từ mặt đất lên với hiệu suất, sự liên quan (hay còn gọi là tìm kiếm chất lượng), và tích hợp đơn giản trong tâm trí. Nó được viết bằng C++ và hoạt động trên Linux (RedHat, Ubuntu, vv), Windows, MacOS, Solaris, FreeBSD và một vài hệ thống khác

+0

Điều này có vẻ thú vị nhưng đáng buồn là tôi bị mắc kẹt với Oracle 10g. – Clinton

+0

Hãy tin tôi nhanh chóng và bạn cũng có thể sống các chỉ số cập nhật .... – Wazzzy

0

Bạn có thể thực hiện điều đó trong Oracle chỉ khi bạn có tùy chọn Intermedia/Oracle Text trên máy chủ ...

Ví dụ, bạn có thể sử dụng

create index t_index_data on t(data) 
indextype is ctxsys.context 
parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE'); 

tôi không chắc chắn nếu bạn cần phải thay đổi kiểu varchar2(100)-clob.

Để biết chi tiết và các tùy chọn/example về loại này chỉ thấy http://download.oracle.com/docs/cd/A91202_01/901_doc/text.901/a90122/ind4.htm

+0

Bạn có chắc chắn rằng chỉ mục này là chất nền? Tôi đọc tài liệu, và có vẻ như tôi cần một "sở thích" "SUBSTRING_INDEX" hoặc một cái gì đó. Bạn có thể đưa ra một ví dụ mã thực hiện những gì tôi đang tìm kiếm bao gồm chỉ mục chuỗi con không? – Clinton

+0

bạn có thể đúng về sở thích - Tôi không có máy chủ Oracle với các tùy chọn sẵn có để tôi không thể kiểm tra ... – Yahia

1

Có bạn cần tạo môi trường trước khi có thể tạo chỉ mục tên miền. Bạn cần phải có người dùng ctxsys và ctxapp cần thiết để tạo ra nó. Làm theo các bước được giải thích trong liên kết bên dưới để có một bước cho môi trường của bạn. Người dùng này không được tạo theo mặc định trong khi cài đặt oracle.

http://www.oraclebin.com/2012/12/creating-environment-for-ctxsys.html

Một khi bạn có tất cả các cấp và các gói bạn có thể tạo ưu đãi và chỉ số như hình vẽ.

SQL> begin 
    2 ctx_ddl.create_preference('SUBSTRING_PREF', 'BASIC_WORDLIST'); 
    3 ctx_ddl.set_attribute('SUBSTRING_PREF', 'SUBSTRING_INDEX','TRUE'); 
    4 end; 
    5/

Bây giờ, hãy tạo chỉ mục tên miền như được hiển thị.

SQL> create index test_idx on test(object_name) 
    2 indextype is ctxsys.context parameters ('wordlist SUBSTRING_PREF MEMORY 50M'); 

Index created. 

select * from test where contains(object_name,'%EXEC%') > 0; 

Xem liên kết dưới đây giải thích điều này với kế hoạch thực hiện.

Tham khảo: http://www.oraclebin.com/2012/12/oracle-text-and-domain-indexes.html

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