Объедините условия в оракуле полнотекстового поиска - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь реализовать полнотекстовый поиск в Oracle, но я не понимаю, как правильно создать поисковый запрос?

Задача состоит в следующем:

  1. Если я пишу слово, все записи должны отображаться и сортироваться по релевантности.В этом случае, когда мой запрос содержит слово «word», в результатах поиска должны отображаться слова «dddwordddd», «word», «wordddd» и «dddword», отсортированные по релевантности.
  2. Если я пишу несколько слов впоисковый запрос, должен отображаться результат, содержащий как все слова, так и часть запроса.Также отсортировано по релевантности.
  3. И должно быть возможно объединить слова в группы.Например, когда я заключаю слова в кавычки (или в любую другую обертку, например, "/" или "["), такой поиск должен выполняться строго, без отдельного поиска по словам.

Iудалось реализовать только часть этого, используя оператор ABOUT.Он идеально подходит для второго пункта задачи.Если я напишу запрос вроде:

SELECT SCORE(1), name 
from table 
WHERE CONTAINS(name, 'ABOUT('some text')', 1) > 0 
ORDER BY SCORE(1) DESC;

, тогда я получу следующие результаты:

some text
some
text

Но как я могу объединить его с поиском по фразе (без отдельного поискапо словам) и при поиске частичных вхождений (например, %word%)?

1 Ответ

0 голосов
/ 22 февраля 2019

Итак, давайте загрузим таблицу с примером текста:

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 в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...