Oracle Text - индексировать поле BLOB (которое содержит данные PDF) - PullRequest
2 голосов
/ 21 июля 2010

Есть ли у вас опыт использования Oracle Text для поиска содержимого в файлах PDF?

У меня есть таблица с полем FILEDATA (blob).

Я быхотел бы выполнить следующий запрос:

SELECT id FROM ttc.contract_attachment WHERE CONTAINS(filedata, 'EXAMPLE') > 0;

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

Я нашел следующий код:

begin 
  ctx_ddl.create_preference('doc_lexer', 'BASIC_LEXER'); 
  ctx_ddl.set_attribute('doc_lexer', 'printjoins', '_-'); 
end; 
/ 

create index idxContentMgmtBinary on CMDEMO.CONTENT_INVENTORY(TEXT) indextype is ctxsys.context
  parameters ('lexer doc_lexer sync (on commit)');

Ссылка: http://www.devx.com/dbzone/Article/21563/1954

Понятия не имею, что такое BASIC_LEXER.Я немного растерялся.Я постараюсь продолжить поиск ответа.Любая помощь будет отличной.

Спасибо.

1 Ответ

1 голос
/ 14 августа 2010

Я использовал Oracle Text для индексации не только PDF, но и других данных, таких как XML-структуры. У Oracle есть концепция лексеров, которые берут контент и анализируют, токенизируют и индексируют токены. Основной лексер обрабатывает английские слова, есть другие лексеры для китайского, японского, корейского и т. Д. Атрибут printjoin позволяет индексировать символы, которые обычно исключаются, такие как дефисы, кавычки и т. Д.

Индекс, который вы определили выше, будет работать. Имейте в виду, что индексация Oracle Text - это асинхронный процесс, то есть происходит фиксация, а затем когда-нибудь в будущем документ будет проиндексирован. Однако вам нужно будет синхронизировать индекс как часть запланированного задания или тому подобное. С опцией «sync (on commit)» в вашем индексе, он будет индексировать документ как часть транзакции. Это примечательно, только если вы индексируете значительные документы PDF.

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

    <query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> cat dog
     <progression>
       <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
     </progression>
   </textquery>
  <score datatype="INTEGER" algorithm="COUNT"/>
</query>

Приведенный выше запрос использует ключевые слова для поиска "cat dog" пытается найти их как фразу, затем любые документы содержат cat AND dog (необязательно рядом друг с другом), затем любой документ, содержащий cat OR dog, документы, содержащие оба слова оценивается выше, чем если бы документ был только один. Кроме того, структура автоматически выводит результаты по мере их возвращения.

С учетом всего сказанного, вы можете просто определить свой индекс как:

create index idxContentMgmtBinary on CMDEMO.CONTENT_INVENTORY(TEXT) 
  indextype is ctxsys.context
  parameters ('sync (on commit)');

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

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