2

テーブルに、コンテキスト インデックスが作成された列 short_desc があります。

以下のように検索すると

select * from table1 where CONTAINS (short_desc,'{product\_id}') > 0 

次のような結果が得られます

abc product_id

abc製品ID

エスケープ文字は OR のように動作し、クエリは「product_id」または「product id」を検索します

「product_id」という単語全体だけを検索するにはどうすればよいですか?

前もって感謝します

4

2 に答える 2

2

Oracle*Text のドキュメントによると、アルファベット以外の文字は空白として扱われます (したがって、product$id と product_id は両方とも「製品 ID」として扱われます)。

この動作は、この SQLFiddleで実証されました。'product' と 'id' の間にどの非英数字記号が配置されていてもかまいません。

これを変更するには、CONTEXT インデックスで使用されるレクサーのようにアンダースコアを定義するprintjoin必要があります。

ここではパッケージへのアクセスが制限されているため、SQLFiddle でこれを示すことはできませんctx_ddlが、このコードはその仕事を行う必要があります。

create table table1(short_desc varchar2(200))
/

-- Add lexer definition and set '_' as "printjoin"
begin
  ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
  ctx_ddl.set_attribute('mylex', 'printjoins', '_');
end;
/

-- Specify new lexer definition while creating index
create index table1_ctx_index on table12(short_desc) 
  indextype is ctxsys.context 
  parameters ( 'LEXER mylex' )
/

insert into table1(short_desc) values('1 product id 2')
/
insert into table1(short_desc) values('3 product_id 4')
/
insert into table1(short_desc) values('5 product#id 6')
/
insert into table1(short_desc) values('7 productXid 8')
/
insert into table1(short_desc) values('9 product-id 10')
/

alter index table1_ctx_index rebuild
/
于 2013-08-10T11:51:59.887 に答える