CONTAINS не работает с Oracle Text - PullRequest
2 голосов
/ 02 марта 2012

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

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.

После некоторого поиска в Google я обнаружил, что проблема может быть в индексе, но когда япосмотрел на таблицу и индекс, они показались мне нормальными.

Создание сценария для индекса выглядит следующим образом

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

Единственное, что мне странно, это то, что когда я смотрю на Редактировать таблицув свойствах таблицы в SQL Developer я вижу, что операционный статус индекса НЕ УКАЗАН.Кто-нибудь знает, что это значит? Может быть, права БД?

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

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

вместо contains

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

PS Это связано с моим предыдущим вопросом Oracle DBMS_LOB.INSTR и СОДЕРЖИТ производительность

ОБНОВЛЕНИЕ

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

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

1 Ответ

4 голосов
/ 02 марта 2012

"Операционный статус индекса НЕ УКАЗАН"

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

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

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


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

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


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

Так что звучит так, будто вы храните документы в двоичном формате.Что за документы?Они в поддерживаемом формате?Это будет зависеть от того, какую версию Oracle вы используете.Например, Oracle Text 10g поддерживает Word 2003 (т.е. только DOC) , тогда как Oracle Text 11g поддерживает Word 2007 (то есть DOCX также) .

...