问题描述
场景: 我有一个名为test1的表,有2列说Id (数字 (10,0)),SearchData(CLOB)。
Statement1: 从test1中选择 * 其中包含 (SEARCHDATA,'\-ETTE AKACOMMON') > 0;
输出: 1 COLL-ETTE AKACOMMON
Statement2: 从test1中选择 * 其中包含 (SEARCHDATA,'COLL \-') > 0;
输出: 1 COLL-ETTE AKACOMMON
Statement3: 从test1中选择 * 其中包含 (SEARCHDATA,'{COLL-ETTE AKACOMMON}') > 0;
输出: 1 COLL-ETTE AKACOMMON
Statement4: 从test1中选择 * 其中包含 (SEARCHDATA,'\-')> 0;
输出: 没有返回行。
在上述情况下,即使在尝试执行select语句时仅传递statement4中的特殊字符,我也希望结果集。如果选择语句不正确,请纠正我。
而且由于上述情况用于搜索,因此我不能期望用户一直输入完整的字符串作为 'coll-ETTE AKACOMMON'。现在,他们正试图从应用程序UI中输入 “-” 来搜索数据。请尽早提供帮助。
另外,如果假设我有第2行中的特殊字符序列,我应该如何构建select语句来获取正确的记录?
请尽快协助。提前谢谢你。
Id SearchData 1 COLL-ETTE AKACOMMON 2 @#$!%*@#$!%*@#$!%*
Statement1: 从test1中选择 * 其中包含 (SEARCHDATA,'\-ETTE AKACOMMON') > 0;
输出: 1 COLL-ETTE AKACOMMON
Statement2: 从test1中选择 * 其中包含 (SEARCHDATA,'COLL \-') > 0;
输出: 1 COLL-ETTE AKACOMMON
Statement3: 从test1中选择 * 其中包含 (SEARCHDATA,'{COLL-ETTE AKACOMMON}') > 0;
输出: 1 COLL-ETTE AKACOMMON
Statement4: 从test1中选择 * 其中包含 (SEARCHDATA,'\-')> 0;
输出: 没有返回行。
在上述情况下,即使在尝试执行select语句时仅传递statement4中的特殊字符,我也希望结果集。如果选择语句不正确,请纠正我。
而且由于上述情况用于搜索,因此我不能期望用户一直输入完整的字符串作为 'coll-ETTE AKACOMMON'。现在,他们正试图从应用程序UI中输入 “-” 来搜索数据。请尽早提供帮助。
另外,如果假设我有第2行中的特殊字符序列,我应该如何构建select语句来获取正确的记录?
请尽快协助。提前谢谢你。
专家解答
默认情况下,Oracle Text将连字符视为单词分隔符。所以它不会将这个存储在索引中。
您可以通过检查D r $$ I表来看到这一点:
要避免这种情况并在单词中包含连字符,请将其指定为printjoin字符。您可以通过创建一个新的首选项来做到这一点。就像这样:
现在,它将连字符视为单词的一部分。而不是像空间这样的分隔符。
但是包含查询在令牌上做一个完全匹配。要解决这个问题,并搜索任何带有连字符的文本,请添加通配符:
您可以通过检查D r $
create table test1 ( id number(10,0), searchdata varchar2(20) ); insert into test1 values (1, 'COLL-ETTE AKACOMMON'); insert into test1 values (2, '@#$!%*@#$!%*@#$!%*'); commit; create index i on test1 ( searchdata ) indextype is ctxsys.context; select token_text from dr$i$i; TOKEN_TEXT AKACOMMON COLL ETTE
要避免这种情况并在单词中包含连字符,请将其指定为printjoin字符。您可以通过创建一个新的首选项来做到这一点。就像这样:
drop index i;
exec ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
exec ctx_ddl.set_attribute('mylex', 'printjoins', '_-');
create index i on test1 ( searchdata )
indextype is ctxsys.context
parameters ( 'LEXER mylex' );
select token_text from dr$i$i;
TOKEN_TEXT
AKACOMMON
COLL-ETTE现在,它将连字符视为单词的一部分。而不是像空间这样的分隔符。
但是包含查询在令牌上做一个完全匹配。要解决这个问题,并搜索任何带有连字符的文本,请添加通配符:
select * from test1 where contains (searchdata ,'\-') > 0; no rows selected select * from test1 where contains (searchdata ,'%\-%') > 0; ID SEARCHDATA 1 COLL-ETTE AKACOMMON
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




