Я использовал 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)');
и это, вероятно, будет работать очень хорошо для ваших нужд. Вам нужно будет только изменить поведение лексера, если у вас есть для этого необходимость. Надеюсь, это поможет.