Indice CTXSYS.CONTEXT

Testato su Oracle 9i - 9.2.0.8.0

Durante l'esecuzione di una dml su una colonna di una tabella compare il seguente errore:

ORA-29861: domain index is marked LOADING/FAILED/UNUSABLE

L'errore è legato alla presenza di un indice su quella colonna di tipo CTXSYS.CONTEXT che risulta essere in stato DOMIDX_OPSTATUS = FAILED cioè che c'è un errore nella dml eseguita sul dominio dell'indice.

SQL> create index u01.t2044r_descrizione_ctx on u01.t2044r_anagrafiche (descrizione)
             indextype is CTXSYS.CONTEXT
             PARAMETERS('LEXER DEFAULT_LEXER');

Il parametro LEXER indica una preferenza relativa al linguaggio del testo che varrà indicizzato.

Query di riferimento

SELECT owner, index_name, index_type, status, domidx_status, domidx_opstatus ,table_name, table_owner
FROM dba_indexes
where index_name='T2044R_DESCRIZIONE_CTX'

Gli indici di tipo ConText, noti come Oracle Text e interMedia Text, è una tecnologia di indicizzazione di testi che permette di interrogare testi come Word, PDF, XML, HTML o semplici documenti di testo.

Dopo aver droppato l'indice e ricreato compare il messaggio:

ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10700: preference does not exist: DEFAULT_LEXER

L'errore è dovuto alla mancata corrispondenza tra la preferenze DEFAULT_LEXER e lo schema owner dell'indice.

select * from ctxsys.ctx_preferences
where  pre_name in( 'DEFAULT_LEXER','DEFAULT_WORDLIST')



Soluzione:


SQL> conn /as sysdba
SQL> GRANT EXECUTE on CTX_DDL to U01;
SQL> conn U01
Enter password:
Connected.
SQL>  begin
ctx_ddl.create_preference ( 'DEFAULT_LEXER', 'BASIC_LEXER' );
end;
SQL>  begin
ctx_ddl.create_preference ( 'DEFAULT_WORDLIST', 'BASIC_WORDLIST' );
end;
SQL> drop index U01.T2044R_DESCRIZIONE_CTX;
SQL>  CREATE INDEX U01.T2044R_DESCRIZIONE_CTX ON U01.T2044R_ANAGRAFICHE
(DESCRIZIONE)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS('LEXER DEFAULT_LEXER')
NOPARALLEL; 

Verifica

SELECT owner, index_name, index_type, status, domidx_status, domidx_opstatus ,table_name, table_owner
FROM dba_indexes
where index_name='T2044R_DESCRIZIONE_CTX'



select * from ctxsys.ctx_preferences
where  pre_name in( 'DEFAULT_LEXER','DEFAULT_WORDLIST')




SINCRONIZZAZIONE dell'indice

Quando viene creato un  CONTEXT indice,  occorre sincronizzare esplicitamente l'indice per mantenerlo aggiornato con eventuali inserimenti, aggiornamenti o eliminazioni nella tabella di testo. Oracle Text consente di farlo con la procedura CTX_DDL.SYNC_INDEX.


Fino a quando non sincronizzi i dati sono visibili da

SQL> select pnd_index_name, pnd_rowid, pnd_timestamp from ctx_user_pending where pnd_index_name = 'T_IND';

Ad esempio sincronizziamo l'indice con 2Mb di memoria

begin
CTX_DDL.SYNC_INDEX ( 'myindex', '2M' );
end;

EXEC CTX_DDL.SYNC_INDEX ( 'myindex', '2M' );


Estrarre la ddl di un Context Index
 
SQL> select ctx_report.create_index_script('<schma>.<nome index>') from dual;

SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)

Specifies SYNC for automatic synchronization of the CONTEXT index when there are inserts, updates or deletes to the base table. You can specify one of the following SYNC methods:
Per cambaire

SQL> exec CTX_DDL.REPLACE_INDEX_METADATA('IX1_PICNOT_AVVISI_CTX','REPLACE METADATA SYNC(MANUAL)');


Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database