Как создать текстовый индекс для поиска «% abc%»? - PullRequest
6 голосов
/ 13 октября 2011

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

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

create table t
(
  data varchar(100)
);

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

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

И это:

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 13 октября 2011

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

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

и посмотритевопрос о том, как управлять обновлением и как индекс не может быть быстрее, чем полное сканирование с данными с большим количеством элементов:

Настройка производительности PL / SQL для LIKE '% ...%' запросов подстановочных знаков

1 голос
/ 11 января 2013

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

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

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;

См. Ссылку ниже, которая объясняет это с планом выполнения. Обновление 2018: Исходная ссылка устарела и, к сожалению, не сохранена в архиве .org.

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

0 голосов
/ 13 октября 2011

Вы можете сделать это в 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

0 голосов
/ 13 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...