Oracle Содержит сбой работы для фразы, содержащей слово "не" - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь найти фразу типа «не помещено» в таблицу, где col индексируется как «indextype is ctxsys.context»

select * from 
table
where contains (col, 'not placed')>0

Без слова «NOT» поиск работает абсолютно без проблем.

Как только в поисковой фразе добавлено "not", возникает проблема ниже -

ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-50901: text query parser syntax error on line 1, column 1  
29902. 00000 -  "error in executing ODCIIndexStart() routine"
*Cause:    The execution of ODCIIndexStart routine caused an error.
*Action:   Examine the error messages produced by the indextype code and
           take appropriate action.

Я даже попытался использовать escape-последовательность для слова "not", но это не удалось распознать само слово "не"

1 Ответ

1 голос
/ 24 марта 2020

not - зарезервированное слово для оператора not. Вам нужно выйти из него, чтобы найти это значение с помощью contains. Сделайте это, заключив его в фигурные скобки {}.

Это также одно из стоп-слов по умолчанию. Они не включены в индекс.

Это создает индекс с пустым списком остановок. Таким образом, оно включает каждое слово:

create table t (
  c1 varchar2(100)
);

insert into t values ( 'placed' );
insert into t values ( 'not placed' );
insert into t values ( 'something else' );
insert into t values ( 'file is placed in folder' ); 
insert into t values ( 'file is not placed in folder' ); 
commit;

create index i 
  on t ( c1 ) 
  indextype is ctxsys.context
  parameters (
    'stoplist ctxsys.empty_stoplist sync(on commit)'
  );

select * from t 
where  contains (c1, 'placed') > 0;

C1                             
placed                          
not placed                      
file is placed in folder        
file is not placed in folder  

select * from t 
where  contains (c1, 'not placed') > 0;

ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-50901: text query parser syntax error on line 1, column 1  

select * from t 
where  contains (c1, '{not} placed') > 0;

C1                             
not placed                      
file is not placed in folder    

Но вы, вероятно, хотите создать свой собственный пользовательский список остановок .

...