Как получить позицию слова в большом тексте (полнотекстовый поиск)?
Есть книга в 2500 страниц и она записана в CLOB.
Как получить местоположение конкретного слова в этой книге?
Нужен механизм, наподобиe индексации полнотекстового поиска.
Но если полнотекстовый поиск индексирует по своему, то мне нужен индекс (или быстрый доступ) лишь к десятку слов.
Как создать такой индекс?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Воспользуйтесь пакетом CTX_ENTITY.
Тестовые данные для примера:
create table books (id int, title varchar2 (96), text clob)
/
insert into books values (1, 'my book', '
Есть книга в 2500 страниц и она записана в CLOB.
Как получить местоположение конкретного слова в этой книге?
Нужен механизм, на подобии индексации полнотекстового поиска.
Но если полнотекстовый поиск индексирует по своему,
то мне нужен индекс (и быстрый доступ) лишь к десятку слов.
Как создать такой, свой индекс?');
Создайте свой собственный сборник правил поиска (тут XML схема):
begin
ctx_entity.create_extract_policy ('mybooks');
ctx_entity.add_extract_rule ('mybooks', 1,
'<rule>' ||
'<expression>' ||
'(местоположение|слова|механизм)' ||
'</expression>' ||
'<type refid="1">xwords</type>' ||
'</rule>');
ctx_entity.compile ('mybooks');
end;
/
В итоге, для книги получите XML документ, содержаший позицию и длину найденых слов:
var rc refcursor
declare
text clob;
ents clob;
begin
select text into text
from books where id = 1;
dbms_lob.createtemporary (ents, true);
ctx_entity.extract ('mybooks', text, null, ents);
open :rc for select x.offset, x.len, x.text, x.type, x.source
from xmlTable ('/entities/entity'
passing xmlType (ents) columns
offset number path '@offset',
len number path '@length',
text varchar2 (16) path 'text/text()',
type varchar2 (16) path 'type/text()',
source varchar2 (16) path '@source') x
order by offset;
end;
/
Результат:
OFFSET LEN TEXT TYPE SOURCE
---------- ---------- ---------------- ---------------- ----------------
64 28 местопол xwords UserRule
91 10 слова xwords UserRule
118 16 механизм xwords UserRule