2

我的表中有一个按上下文索引的列 short_desc。

当我像下面这样搜索时

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

我得到类似的结果

abc product_id

abc 产品编号

转义字符的行为类似于 OR 并且查询搜索“product_id”或“product id”

如何仅搜索整个单词“product_id”?

提前致谢

4

2 回答 2

2

根据Oracle*Text 文档,非字母字符被视为空格(因此 product$id 和 product_id 都被视为“产品 id”)。

此行为在此 SQLFiddle中演示。在“产品”和“标识”之间放置哪个非字母数字符号并不重要。

要更改它,您必须在 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 回答
0

可以试试这个

 select * from table1 where CONTAINS (short_desc,'{product'||'\_id}') > 0
于 2013-08-09T15:58:56.307 回答