【问题标题】:Oracle Text Contains and technical contentOracle Text 包含和技术内容
【发布时间】:2018-01-02 13:25:20
【问题描述】:

我正在搜索技术词“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 位生产

【问题讨论】:

  • 您是专门搜索单个单词的吗?或者你有什么模式?
  • @Ravi:上面提到的一个词,没有任何规律。
  • 那么,你为什么在那里使用模式? ?
  • 请从您的表格和您的预期输出中采样数据,以使您的问题更清晰

标签: oracle lexer oracle11gr2 oracle-text


【解决方案1】:

首先,您必须在词法分析器中将连字符定义为 printjoin

检查一下

select IXV_ATTRIBUTE, IXV_VALUE from CTXSYS.CTX_INDEX_VALUES where IXV_CLASS =  'LEXER';

IXV_ATTRIBUTE                  IXV_VALUE     
-----------------------------------------
PRINTJOINS                     _$%&-         
NUMJOIN                        .              
NUMGROUP                       .              
WHITESPACE                     ,= 

然后您可以(在使用此词法分析器重新创建索引之后)验证标记是否符合预期:(您的表会根据索引名称而有所不同;检查所有表,例如 '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),用花括号转义不起作用(返回不匹配),但使用反斜杠很好。

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 

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2014-07-03
    • 2017-04-09
    • 2023-03-11
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多