2011-10-13 26 views
6

aşağıdaki'% abc%' araması için metin dizini nasıl oluşturulur?

create table t 
(
    data varchar(100) 
); 

ben verimli aşağıdakileri yapabilmek için bir dizin oluşturmak istediğiniz gibi bir tablo varsa ben x like '%abc%'

gibi endeks sorguları istiyorum:

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

Ve bu:

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

ben Ayrıca bu tablonun canlı olarak güncellenmesini istiyorum.

Böyle bir dizini nasıl oluştururum? (Bir ctxcat dizinine ihtiyacım var, ancak ne tür seçenekler vermem gerektiği konusunda kafam karıştı)

Oracle 10g kullanıyorum. veritabanı Eğer Sphinx Search

Sphinx kullanabilirsiniz ardından büyükse

cevap

7

Bu

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') 

parametreler burada Oracle Text Reference

açıklanmıştır (Değerleri uygun olanı için min ve max uzunluk set) kullanmak istiyorsunuz bakınız

ve bu yenilemeyi nasıl yöneteceğiniz ve dizinin yüksek kardinallik verileriyle tam bir taramadan nasıl daha hızlı olmayabileceğini görün:

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

+1

Cevabınız için teşekkürler. Sadece birkaç soru: 'abc%' sorguları için 'prefix_index' ve'% abc% 'sorgular için 'substring_index' var mı? Ve alt dizin dizini varsayılan olarak tüm alt dizeleri indeksliyor mu? Ayrıca, bu dizini nasıl kullanırım? Will içerir (col, '% abc%') 've' içerir (col, 'abc%') hile yapmak? – Clinton

+0

Evet, bu aramalar işe yarayacak, benden daha iyi açıklayabilecek bir bağlantıyla güncellendi, ancak esas olarak parametreler tam olarak bu tür aramaların performansını artırmak için kullanıldı. –

0

yukarı performans, alaka ile sıfırdan tasarlanmış bir açık kaynak tam metin arama sunucusu, sorununuza en edilmektedir bakıyor (aka kaliteyi aramak) ve entegrasyon basitliği akılda. C++ 'da yazılmıştır ve Linux (RedHat, Ubuntu, vb.), Windows, MacOS, Solaris, FreeBSD ve diğer birkaç sistemde çalışan

+0

Bu ilginç görünüyor, ama ne yazık ki Oracle 10 g ile sıkıştım. – Clinton

+0

Bana hızlı bir şekilde inanıyorum ve güncellemeler indeksleri yaşayabilirsiniz .... – Wazzzy

0

Sadece Oracle'da intermedia/Oracle Text seçeneğiniz varsa bunu yapabilirsiniz. Eğer varchar2(100) den clob için türünü değiştirmek gerekiyorsa sunucu ... senin Örneğin

Eğer

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

emin değilim kullanabilirsiniz. endekslerinin bu tür ile ilgili detaylar ve seçenekler/Örneğin

http://download.oracle.com/docs/cd/A91202_01/901_doc/text.901/a90122/ind4.htm

+0

Bu endeksleri dizine eklediğinizden emin misiniz? Belgeyi okudum ve "tercih" "SUBSTRING_INDEX" ya da bir şeye ihtiyacım var gibi görünüyor. Alt dizin dizini de dahil olmak üzere aradığım şeyi yapan bir kod örneği verebilir misiniz? – Clinton

+0

tercihi ile ilgili haklı olabilirsiniz - Bu seçeneklerle bir Oracle sunucum yok, bu yüzden test edemiyorum ... – Yahia

1

Evet, etki alanı dizinleri oluşturmadan önce bir ortam oluşturmanız gerekir. Oluşturmak için ctxsys kullanıcısına ve gerekli ctxapp previliges'e sahip olmanız gerekir. Ortamınıza sahip olmak için aşağıdaki linkte açıklanan adımları izleyin. Bu kullanıcı Oracle'ı kurarken varsayılan olarak oluşturulmaz.

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

gösterildiği gibi tüm hibe ve tercihlerini oluşturabilir paketleri ve dizini sahip olduktan sonra.

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

Şimdi gösterildiği gibi bir etki alanı dizini oluşturun.

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; 

Yürütme planı ile bunu açıklayan aşağıdaki bağlantıya bakın.

Referanslar: http://www.oraclebin.com/2012/12/oracle-text-and-domain-indexes.html

İlgili konular