Как синхронизировать и оптимизировать индекс Oracle Text? - PullRequest
9 голосов
/ 16 декабря 2009

Мы хотим использовать индексный тип ctxsys.context для полнотекстового поиска. Но я был довольно удивлен, что индекс этого типа не обновляется автоматически. У нас есть 3 миллиона документов с 10 000 обновлений / вставок / удалений в день.

Каковы ваши рекомендации по синхронизации и оптимизации индекса Oracle Text?

Ответы [ 3 ]

16 голосов
/ 16 декабря 2009

Что вы подразумеваете под "не обновляется автоматически"?

Индекс может быть синхронизирован при фиксации или периодически.

Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC ( ON COMMIT)')
Create index ... on ... INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS 'SYNC (EVERY "SYSDATE+1/24")')

Если вам не нужна точность поиска в реальном времени, наш DBA рекомендовал периодически синхронизировать индекс, скажем, каждые 2 минуты Если вы можете позволить себе сделать это в одночасье, то даже лучше. Что лучше, зависит от вашей загрузки и размера документа.

Эти ссылки могут предоставить вам дополнительную информацию:

Для совета DBA, может быть, серверный сбой лучше?

3 голосов
/ 16 декабря 2009

Я думаю, что опция «SYNC EVERY», как описано в предыдущем ответе, доступна только в Oracle 10g или новее. Если вы используете более старую версию Oracle, вам придется периодически запускать операцию синхронизации. Например, вы можете создать следующую хранимую процедуру:

CREATE OR REPLACE 
Procedure sync_ctx_indexes
IS
 CURSOR sql1 is select distinct(pnd_index_owner||'.'||pnd_index_name) as index_name from ctx_pending;
BEGIN
 FOR rec1 IN sql1 LOOP
 ctx_ddl.sync_index(rec1.index_name);
 END LOOP;
END;

, а затем запланировать его запуск через DBMS_JOB:

DBMS_JOB.SUBMIT(job_id, 'sync_ctx_indexes;', SYSDATE, 'SYSDATE + 1/720');

Что касается оптимизации индекса, можно использовать следующую команду (также можно запланировать с помощью DBMS_JOB или cron):

alter index my_index rebuild online parameters('optimize full maxtime 60');

Существует также пакет CTX_ * с аналогичной функцией.

1 голос
/ 06 декабря 2016

Выкладываем это здесь как обновление для пользователей Oracle 12C. Если вы используете индекс в режиме реального времени, он сохраняет элементы в памяти и периодически передает их в основные таблицы, что снижает фрагментацию и позволяет выполнять поиск NRT в потоковом контенте. Вот как это настроить

exec ctx_ddl.drop_preference ( 'your_tablespace' );
exec ctx_ddl.create_preference( 'your_tablespace', 'BASIC_STORAGE' );
exec ctx_ddl.set_attribute ( 'your_tablespace', 'STAGE_ITAB', 'true' );
create index  some_text_idx on your_table(text_col)  indextype is ctxsys.context PARAMETERS ('storage your_tablespace sync (on commit)')

это установит индекс в режиме NRT. Это довольно мило.

...