2012-03-02 6 views
2

У меня возникла проблема с выполнением этого запроса.CONTAINS не работает с Oracle Text

SELECT * FROM gob_attachment 
WHERE CONTAINS (gob_a_document, 'java') > 0 

Это дает мне

ORA-29902: error in executing ODCIIndexStart() routine 
ORA-20000: Oracle Text error: 
ORA-00942: table or view does not exist 

29902. 00000 - "error in executing ODCIIndexStart() routine" 
*Cause: The execution of ODCIIndexStart routine caused an error. 
*Action: Examine the error messages produced by the indextype code and 
     take appropriate action. 

Через некоторое Googling я disovered, что проблема может быть в индексе, но когда я посмотрел на стол и указательным они казались мне хорошо.

Создание сценария для индекса выглядит как этот

CREATE INDEX FTSI_GOB_A_DOCUMENT 
ON GOB_ATTACHMENT (GOB_A_DOCUMENT) 
INDEXTYPE IS CTXSYS.CONTEXT; 

Единственное, что странно для меня является то, что, когда я смотрю Редактировать таблицу в таблицу свойств в SQL Developer я могу видеть, что Рабочее состояние индекса FAILED , Кто-нибудь знает, что это значит? Возможно, права БД?

Также он работает, когда я использую

dbms_lob.instr(gob_a_document, utl_raw.cast_to_raw('java')) > 0 

вместо contains

Спасибо за любые советы

P.S. Это связанно с моим предыдущим вопросом Oracle DBMS_LOB.INSTR and CONTAINS performance

UPDATE

После воссоздания индекса и некоторые игры вокруг, я disovered, что я могу выполнить запрос выше, но это не вернет мне что-нибудь.

Если я попробую с CONTAINS(gob_a_document, '%'), результат будет 26 строк и не знаю, по какому ключе выбранный запрос (по крайней мере, я не нашел ничего очевидного, я исследую его больше). Проблема может быть в том, что мы используем Oracle 10g и хранение DOCX файлов, которые поддерживаются с версии 11.

ответ

4

«Рабочее состояние индекса FAILED»

Хорошо, это означает, что ваш CREATE INDEX ошибки оператора , Вы получили сообщение об ошибке? Думаю, ответ да, но вы его пропустили. Так что вам нужно сделать, это:

  • падение индекса
  • повторно запустить INDEX заявление
  • CREATE, если он выдает ошибку, сделать отметку о причине и исправить это

Если это не очевидно, другой оператор работает, потому что он не пытается использовать ваш индекс CONTEXT. Это делает поиск трудным путем.


«Дело в том, что индекс был уже создан в БД,»

Нет реальная вещь была индекс не удалось создать должным образом, следовательно, его статус.Вы могли бы просто перестроить индекс, но обычно лучше сначала исправить основную причину сбоя. Вот почему я посоветовал вам бросить и воссоздать. Очевидно, что первоначальный сбой произошел из-за какого-то условия окружающей среды, которое больше не применяется.


«Теперь запрос выполняется, но это не дает мне никаких результатов (0 строк возвращается). (И я уверен, что он должен вернуться, как 100 строк)»

Таким образом, похоже, что вы храните документы в двоичном формате. Какие документы? Являются ли они в поддерживаемом формате? Это будет зависеть от того, какую версию Oracle вы используете. Например, Oracle Text 10g supports up t Word 2003 (i.e. DOC only), тогда как Oracle Text 11g supports Word 2007 (i.e. DOCX as well).

+0

Дело в том, что индекс уже был создан в БД, поэтому сценарий, который я опубликовал здесь, был скопирован и вложен из SQL-разработчика. Поэтому я последовал твоему совету и воссоздал индекс. Теперь запрос выполняется, но он не дает мне никаких результатов (возвращается 0 строк). (и я уверен, что он должен вернуться как 100 строк) –

+0

Мы храним документы во всех форматах (PDF, Word, HTML, ...). Также DOCS может вызвать проблему. Поэтому мой вопрос заключается в том, что сохранение неподдерживаемого типа документа (DOCX) приведет к моей проблеме? Этот запрос ничего не вернет? Мы используем Oracle 10g, а тип данных в столбце: BLOB –

+0

будет хранить неподдерживаемый тип документа (DOCX) привести к вашей проблеме? Это, безусловно, способ сделать ставку. Но вам нужно будет расследовать это для себя, так как у меня нет экземпляра 10g для игры. – APC