Oracle Text 包含和技术内容
Oracle Text Contains and technical content
我正在搜索技术词 "AN-XYZ99"。所以我用
SELECT *
FROM foo
WHERE CONTAINS(bar, 'AN{-}XYZ99') > 0
但我也得到了 "FO-XYZ99" 或 "BAR-XYZ99" 这样的结果。我该怎么做才能确保预期的结果?
我用过
BEGIN
CTX_DDL.CREATE_PREFERENCE('FOO','BASIC_LEXER');
CTX_DDL.SET_ATTRIBUTE('FOO', 'ALTERNATE_SPELLING', 'GERMAN');
CTX_DDL.SET_ATTRIBUTE('FOO', 'COMPOSITE', 'GERMAN');
CTX_DDL.SET_ATTRIBUTE('FOO', 'MIXED_CASE', 'NO');
END;
来自列 "bar" 的示例数据 (VARCHAR2(4000)):
"unbekannt Stadt Text: AN-XYZ99 << foobar Straße 31.12.2017 Datum Host 20160101 foo"
"unbekannt Stadt Text: FO-XYZ99 << foobar Straße 31.12.2017 Datum Host 20160101 bar"
"unbekannt Stadt Text: BAR-XYZ99 << foobar Straße 31.12.2017 Datum Host 20160101 bla"
对于上面的语句,我希望第一行作为输出,但我也得到了第二行和第三行。
Oracle 数据库 11g 企业版 11.2.0.3.0 版 - 64 位生产
首先,您必须在词法分析器中将连字符定义为 printjoin
。
用
检查一下
select IXV_ATTRIBUTE, IXV_VALUE from CTXSYS.CTX_INDEX_VALUES where IXV_CLASS = 'LEXER';
IXV_ATTRIBUTE IXV_VALUE
-----------------------------------------
PRINTJOINS _$%&-
NUMJOIN .
NUMGROUP .
WHITESPACE ,=
然后您可以(在使用此词法分析器重新创建索引后)验证标记是否符合预期:(您的 table 会因索引名称而异;检查所有 table 之类的'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
not 包含 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)用花括号转义不起作用(returns 不匹配),但使用反斜杠没问题。
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
我正在搜索技术词 "AN-XYZ99"。所以我用
SELECT *
FROM foo
WHERE CONTAINS(bar, 'AN{-}XYZ99') > 0
但我也得到了 "FO-XYZ99" 或 "BAR-XYZ99" 这样的结果。我该怎么做才能确保预期的结果?
我用过
BEGIN
CTX_DDL.CREATE_PREFERENCE('FOO','BASIC_LEXER');
CTX_DDL.SET_ATTRIBUTE('FOO', 'ALTERNATE_SPELLING', 'GERMAN');
CTX_DDL.SET_ATTRIBUTE('FOO', 'COMPOSITE', 'GERMAN');
CTX_DDL.SET_ATTRIBUTE('FOO', 'MIXED_CASE', 'NO');
END;
来自列 "bar" 的示例数据 (VARCHAR2(4000)):
"unbekannt Stadt Text: AN-XYZ99 << foobar Straße 31.12.2017 Datum Host 20160101 foo"
"unbekannt Stadt Text: FO-XYZ99 << foobar Straße 31.12.2017 Datum Host 20160101 bar"
"unbekannt Stadt Text: BAR-XYZ99 << foobar Straße 31.12.2017 Datum Host 20160101 bla"
对于上面的语句,我希望第一行作为输出,但我也得到了第二行和第三行。
Oracle 数据库 11g 企业版 11.2.0.3.0 版 - 64 位生产
首先,您必须在词法分析器中将连字符定义为 printjoin
。
用
检查一下select IXV_ATTRIBUTE, IXV_VALUE from CTXSYS.CTX_INDEX_VALUES where IXV_CLASS = 'LEXER';
IXV_ATTRIBUTE IXV_VALUE
-----------------------------------------
PRINTJOINS _$%&-
NUMJOIN .
NUMGROUP .
WHITESPACE ,=
然后您可以(在使用此词法分析器重新创建索引后)验证标记是否符合预期:(您的 table 会因索引名称而异;检查所有 table 之类的'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
not 包含 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)用花括号转义不起作用(returns 不匹配),但使用反斜杠没问题。
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