首先,必须将连字符定义为
printjoin
在你的lexer里。
请检查
select IXV_ATTRIBUTE, IXV_VALUE from CTXSYS.CTX_INDEX_VALUES where IXV_CLASS = 'LEXER';
IXV_ATTRIBUTE IXV_VALUE
-----------------------------------------
PRINTJOINS _$%&-
NUMJOIN .
NUMGROUP .
WHITESPACE ,=
然后,您可以(使用此lexer重新创建索引后)验证标记是否如预期的那样:(您的表将根据索引名称而变化;请检查所有表,如“DR$%%I”)
select TOKEN_TEXT from DR$TEXTIDX_IDX$I where TOKEN_TEXT like '%-XYZ99';
TOKEN_TEXT
----------------------------------------------------------------
AN-XYZ99
BAR-XYZ99
FO-XYZ99
现在您可以查询搜索字符串。
你必须避开连字符
BAR-XYZ99
将查找具有的行
BAR
不
包含
XYZ99
; 虽然
documentation of
hyphen with no space
有点不同。
SELECT SCORE(1),txt
FROM textidx
WHERE CONTAINS(txt, 'BAR-XYZ99',1) > 0;
SCORE(1) TXT
---------- ------------------------------------------------------------------------------------
4 unbekannt Stadt Text: FO-XYZ99 << foobar StraÃe 31.12.2017 Datum Host 20160101 bar
出于某种原因(我的版本是11.2.0.2.0),用大括号转义不起作用(不返回匹配),但使用反斜杠也可以。
SELECT SCORE(1),txt
FROM textidx
WHERE CONTAINS(txt, 'BAR\-XYZ99',1) > 0;
SCORE(1) TXT
---------- ------------------------------------------------------------------------------------
4 unbekannt Stadt Text: BAR-XYZ99 << foobar StraÃe 31.12.2017 Datum Host 20160101 bla