Проблема с оператором contains

Dancing-master
Дата: 09.03.2007 13:42:24
Что делать если нужно найти в тексте строку, содержащую специальные символы.
Например, хочу найти все вопросительные предложения.
Предположим что поле info таблицы содержит одно предложение

Такой вариант не работает
select info
from test_table
where contains(info,'%?%')>0

Подскажите пожалуйста как это сделать?
__mike__
Дата: 09.03.2007 13:50:51
with t as (
select 'tfhsdfhhgsdf ? wrhwerhjhefr' text from dual
union all
select 'tfhsdfhhgsdf wrhwerhjhefr' text from dual
)
select text from t where instr(text,'?')>0
dmidek
Дата: 09.03.2007 14:12:14
__mike__
with t as (
select 'tfhsdfhhgsdf ? wrhwerhjhefr' text from dual
union all
select 'tfhsdfhhgsdf wrhwerhjhefr' text from dual
)
select text from t where instr(text,'?')>0


Возможно (с учетом прямой речи например) нужно проверять последний символ
строки на "?" ( Возможно с учетом RTRIM )
__mike__
Дата: 09.03.2007 15:08:00
согласен
AlexOI
Дата: 09.03.2007 15:11:56
Чтобы работал contains надо чтобы слово попадало в текстовый индекс. Если определить символ ? как печатный с помощью параметра printjoins лексера то он будет попадать в текстовый индекс, кроме случаев, когда он замыкает слово или стоит отдельно. Это происходит потому что он является знаком пунктуации.
Dancing-master
Дата: 09.03.2007 15:47:06
Если не трудно напишите пожалуйста как это определить
AlexOI
Дата: 09.03.2007 15:53:31
begin
ctx_ddl.drop_preference('my_lexer');
end;
/

begin
ctx_ddl.create_preference( 'my_lexer', 'BASIC_LEXER' );
ctx_ddl.set_attribute( 'my_lexer', 'printjoins', '?' );
end;
/

create index proba_text on proba(text)
indextype is ctxsys.context
parameters( 'lexer my_lexer sync(on commit) transactional');

В printjoins - многосимвольный параметр и может быть, например '?-_'
AlexOI
Дата: 09.03.2007 17:17:27
Небольшое дополнение.
Можно переопределить список символов пунктуации. Для этого устанавливаем следущий атрибут лексера:

ctx_ddl.set_attribute( 'my_lexer', 'punctuations', '.,;' );

где перечисляем все символы которые считаем символами пунктуации. Если там не будет "?", то он будет попадать в текстовый индекс как обычный буквенный символ. Тогда можно будет искать по нему вне зависимости от его положения. Только перед ним в запросе необходимо ставить обратный слэш.

select info
from test_table
where contains(info,'%\?%')>0