代码之家  ›  专栏  ›  技术社区  ›  Toru

Oracle文本包含和技术内容

  •  1
  • Toru  · 技术社区  · 7 年前

    I'am search for the technical word“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 Database 11g Enterprise Edition 11.2.0.3.0版-64位生产

    1 回复  |  直到 7 年前
        1
  •  2
  •   Marmite Bomber    7 年前

    首先,必须将连字符定义为 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