Как получить позицию слова в большом тексте (полнотекстовый поиск)?

Есть книга в 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        
→ Ссылка