Итак, давайте загрузим таблицу с примером текста:
create table t (
c1 varchar2(100)
);
insert into t values ( 'some text' );
insert into t values ( 'some' );
insert into t values ( 'text' );
insert into t values ( 'exact phrase text' );
insert into t values ( 'phrase text' );
insert into t values ( 'exact phrase text word' );
insert into t values ( 'exact some wordddd phrase ' );
insert into t values ( 'phrase exact text dddword' );
commit;
create index i
on t ( c1 )
indextype is ctxsys.context;
1) Вы можете использовать подстановочные знаки для поиска строк в строках:
SELECT SCORE(1), c1
from t
WHERE CONTAINS( c1, '%word%', 1 ) > 0
ORDER BY SCORE(1) DESC;
SCORE(1) C1
5 exact phrase text word
5 phrase exact text dddword
5 exact some wordddd phrase
Если вы хотите установить приоритет текстакоторый содержит точную строку «слово», используйте ИЛИ для поиска точного соответствия.Чтобы обеспечить точное совпадение ранга выше, вы также можете взвесить этот термин, «умножив» его с помощью оператора веса:
SELECT SCORE(1), c1
from t
WHERE CONTAINS( c1, '%word% or word*2', 1 ) > 0
ORDER BY SCORE(1) DESC;
SCORE(1) C1
11 exact phrase text word
5 phrase exact text dddword
5 exact some wordddd phrase
2) Оператор О выполняет поиск связанных терминов или фраз.Например, вы можете использовать это для возврата документов, включая «строку», когда вы ищете «текст».Если вы хотите найти текст, содержащий какие-либо слова из списка, ИЛИ их вместе:
SELECT SCORE(1), c1
from t
WHERE CONTAINS( c1, 'some OR text', 1 ) > 0
ORDER BY SCORE(1) DESC;
SCORE(1) C1
3 some text
3 text
3 phrase exact text dddword
3 phrase text
3 exact phrase text word
3 exact phrase text
3) Чтобы найти конкретную фразу, введите точную фразу в вашем содержимом:
SELECT SCORE(1), c1
from t
WHERE CONTAINS( c1, 'exact phrase', 1 ) > 0
ORDER BY SCORE(1) DESC;
SCORE(1) C1
4 exact phrase text word
4 exact phrase text
Если вы ищете текст, который включает в себя любую комбинацию вышеуказанных поисков, вы можете попробовать объединить их все в один вызов CONTAINS.Но проще ИЛИ разделить звонки на CONTAINS.Введите новое значение для третьего параметра для каждого.Затем вы можете получить за него счет, передав то же значение в SCORE:
SELECT SCORE(1), SCORE(2), SCORE(3),
SCORE(1) + SCORE(2) + SCORE(3) tot_score,
c1
from t
WHERE CONTAINS( c1, 'exact phrase', 1 ) > 0
OR CONTAINS( c1, '%word% or word*2', 2 ) > 0
OR CONTAINS( c1, 'some or text', 3 ) > 0
ORDER BY SCORE(1) + SCORE(2) + SCORE(3) DESC;
SCORE(1) SCORE(2) SCORE(3) TOT_SCORE C1
4 11 3 18 exact phrase text word
0 5 3 8 phrase exact text dddword
4 0 3 7 exact phrase text
0 5 0 5 exact some wordddd phrase
0 0 3 3 text
0 0 3 3 some text
0 0 3 3 phrase text
Если вы хотите узнать больше, посмотрите операторы запроса CONTAINS в документации.