Как создать текстовый индекс для поиска% abc%?

Я хотел бы индексировать запросы, такие как x like '%abc%'

Если у меня есть таблица, подобная следующей

 create table t ( data varchar(100) ); 

Я хочу создать индекс, чтобы иметь возможность сделать следующее эффективно:

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

И это:

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

Я также хочу, чтобы эта таблица обновлялась вживую.

Как создать такой индекс? (У меня такое чувство, что мне нужен индекс ctxcat , но я смущен тем, какие варианты мне нужно дать)

Я использую Oracle 10g.

    Я бы использовал это (установил минимальную и максимальную длину для соответствия значениям)

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

    Здесь описываются параметры Oracle Text Reference

    и см. этот вопрос о том, как управлять обновлением и как индекс может быть не быстрее полного сканирования с данными высокой мощности:

    PL / SQL Performance Tuning для LIKE '% …%' Подстановочные запросы

    Да, вы должны создать среду, прежде чем сможете создавать индексы домена. Для его создания необходим пользователь ctxsys и необходимые ctxapp previliges. Выполните шаги, описанные в ссылке ниже, чтобы иметь один для вашей среды. Этот пользователь не создается по умолчанию при установке oracle.

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

    Когда у вас есть все гранты и пакеты, вы можете создавать настройки и индексы, как показано.

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

    Теперь создайте индекс домена, как показано.

      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; 

    См. Приведенную ниже ссылку, в которой объясняется это с планом выполнения.

    Ссылки: http://www.oraclebin.com/2012/12/oracle-text-and-domain-indexes.html

    Если посмотреть на вашу проблему, если ваша база данных большая, вы можете использовать Sphinx Search

    Sphinx – это полнотекстовый поисковый сервер с открытым исходным кодом, разработанный с нуля с эффективностью, релевантностью (ака качество поиска) и простотой интеграции. Он написан на C ++ и работает на Linux (RedHat, Ubuntu и т. Д.), Windows, MacOS, Solaris, FreeBSD и нескольких других системах

    Вы можете сделать это в Oracle только в том случае, если у вас есть опция intermedia / Oracle Text на сервере …

    Для вашего примера вы можете использовать

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

    Я не уверен, что вам нужно изменить тип от varchar2(100) до clob .

    Подробные сведения и варианты / примеры по этим типам индексов см. По адресу http://download.oracle.com/docs/cd/A91202_01/901_doc/text.901/a90122/ind4.htm.