Oracle
 sql >> Base de données >  >> RDS >> Oracle

Requête avec caractère générique et point ne correspondant pas aux données avec l'index Oracle Text

C'est parce que votre analyseur lexical par défaut traite le point comme un séparateur de mots.

Configuration initiale :

create table my_table(item_number varchar2(50 byte) not null);

insert into my_table values ('1234.1234');

create index my_index on my_table (item_number) 
indextype is ctxsys.context;

Cela obtient le comportement que vous voyez :

SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0;

--------------------------------------------------
1234.1234

SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;

no rows selected

Si vous ajoutez un lexer qui définit PRINTJOINS pour inclure le point :

drop index my_index;

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

create index my_index on my_table (item_number) 
indextype is ctxsys.context
parameters ('lexer my_lexer');

alors il se comporte comme vous le souhaitez :

SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;

ITEM_NUMBER
--------------------------------------------------
1234.1234

En savoir plus sur les éléments d'indexation de texte .