Oracle Text progressive relaxation

hello,
We're in the process of evaluating Oracle Text search engine so far so good until yesterday when we added Synonyms to our progressive search criterion and it stop working depending on where we place the synonym search. If we place it first everything else stops working (stemming, fuzzy...) If we place it last then the synonym search stops working. I saw a reference to a bug in this conference that seemed similar to the problem, I believe it mentioned that it had been fixed in 10.2.0.3 (this is the version were on).
The following is a sample of plsql code were executing
select score(1), nm_resource, ADDR_RSRC_ST_LN_1, id_resource, ADDR_RSRC_CITY FROM caps_resource where
CONTAINS (nm_resource,
     '<query>
     <textquery lang="ENGLISH" grammar="CONTEXT">' || res_name ||
     '<progression>
<seq><rewrite>transform((TOKENS, ?{?, ?}?, ?AND?))</rewrite></seq>
<seq><rewrite>transform((TOKENS, ??{?, ?}?, ?AND?))</rewrite>/seq>
<seq><rewrite>transform((TOKENS, ?{?, ?}?, ?OR?))</rewrite></seq>
<seq><rewrite>transform((TOKENS, ??{?, ?}?, ?OR?))</rewrite>/seq>
<seq><rewrite>transform((TOKENS, ?{?, ?}?, ?ACCUM?))</rewrite></seq>
<seq><rewrite>transform((TOKENS, ?{?, ?}?, ?NEAR?))</rewrite></seq>
<seq>' || 'SYN(' || REPLACE('' || res_name || '', ' ', ',IMPACT_tst) AND SYN(') || ',IMPACT_tst)' || '</seq>
</progression>
</textquery>
<score datatype="INTEGER" algorithm="default"/>
</query>', 1)>0

Here is a suggested alternative. I have used a syns function that I wrote for another user on another thread, that checks for all combinations of words that could amount to a synonym, up to the maximum number of words that you can specify as an input parameter. I have then used that in a separate contains clause and combined the score results, using the score derived from the synonym only when there is no score from the progressive rewrites, ordering by the progressive rewrites first. Also notice that the ordering must be done in an inner sub-query then the rows limited in an outer subquery. Otherwise it can select the first 100 rows, then order them, instead of the other way around, which can produce an entirely different result set.
SCOTT@orcl_11g> CREATE TABLE caps_resource
  2    (nm_resource       VARCHAR2 (30))
  3  /
Table created.
SCOTT@orcl_11g> INSERT ALL
  2  INTO caps_resource VALUES ('Delagarza,Lorenzo')
  3  INTO caps_resource VALUES ('Diana De La Garza')
  4  INTO caps_resource VALUES ('De La Garza,Fred')
  5  INTO caps_resource VALUES ('somebody else')
  6  SELECT * FROM DUAL
  7  /
4 rows created.
SCOTT@orcl_11g> CREATE INDEX your_index ON caps_resource (nm_resource)
  2  INDEXTYPE IS CTXSYS.CONTEXT
  3  /
Index created.
SCOTT@orcl_11g> BEGIN
  2    CTX_THES.CREATE_THESAURUS ('impact_tst');
  3    CTX_THES.CREATE_RELATION ('impact_tst', 'Delagarza', 'SYN', 'De La Garza');
  4  END;
  5  /
PL/SQL procedure successfully completed.
SCOTT@orcl_11g> create or replace function syns
  2    (p_words in varchar2,
  3       p_thes     in varchar2,
  4       p_num     in number default 3) -- maximum number of words per synonym phrase
  5       return varchar2
  6  as
  7    v_words_in      varchar2 (32767) := ltrim (p_words) || ' ';
  8    v_words_out     varchar2 (32767);
  9  begin
10    while instr (v_words_in, '  ') > 0 loop
11        v_words_in := replace (v_words_in, '  ', ' ');
12    end loop;
13    while length (v_words_in) > 1
14    loop
15        for i in reverse 1 .. least (p_num, (length (v_words_in) - length (replace (v_words_in, ' ', ''))))
16        loop
17          if instr (ctx_thes.syn (substr (v_words_in, 1, instr (v_words_in, ' ', 1, i) - 1), p_thes), '|') > 0
18            or i = 1 then
19            v_words_out := v_words_out
20            || ' AND ('
21            || ctx_thes.syn (substr (v_words_in, 1, instr (v_words_in, ' ', 1, i) - 1), p_thes)
22            || ')';
23            v_words_in := substr (v_words_in, instr (v_words_in, ' ', 1, i) + 1);
24            exit;
25          end if;
26        end loop;
27    end loop;
28    return ltrim (v_words_out, ' AND ');
29  end syns;
30  /
Function created.
SCOTT@orcl_11g> show errors
No errors.
SCOTT@orcl_11g> VARIABLE res_name VARCHAR2 (100)
SCOTT@orcl_11g> EXEC :res_name := 'De La Garza'
PL/SQL procedure successfully completed.
SCOTT@orcl_11g> SELECT syns (:res_name, 'impact_tst') FROM DUAL
  2  /
SYNS(:RES_NAME,'IMPACT_TST')
({DE LA GARZA}|{DELAGARZA})
SCOTT@orcl_11g> SELECT the_score, nm_resource
  2  FROM   (select DECODE (score(1), 0, SCORE(2), SCORE(1)) AS the_score, nm_resource
  3            FROM   caps_resource
  4            where  CONTAINS (nm_resource,
  5            '<query>
  6            <textquery lang="ENGLISH" grammar="CONTEXT">' || :res_name ||
  7             '<progression>
  8                <seq><rewrite>transform((TOKENS, "{",  "}", "AND"))</rewrite></seq>
  9                <seq><rewrite>transform((TOKENS, "?{", "}", "AND"))</rewrite>/seq>
10                <seq><rewrite>transform((TOKENS, "{",  "}", "OR"))</rewrite></seq>
11                <seq><rewrite>transform((TOKENS, "?{", "}", "OR"))</rewrite>/seq>
12                <seq><rewrite>transform((TOKENS, "{",  "}", "ACCUM"))</rewrite></seq>
13                <seq><rewrite>transform((TOKENS, "{",  "}", "NEAR"))</rewrite></seq>
14              </progression>
15            </textquery>
16            <score datatype="INTEGER" algorithm="default"/>
17             </query>', 1) > 0
18            OR     CONTAINS (nm_resource, syns (:res_name, 'impact_tst'), 2) > 0
19            ORDER  BY SCORE (1) DESC, SCORE (2) DESC)
20  WHERE  ROWNUM < 100
21  /
THE_SCORE NM_RESOURCE
        76 Diana De La Garza
        76 De La Garza,Fred
         5 Delagarza,Lorenzo
SCOTT@orcl_11g>

Similar Messages

  • Oracle Text query: Escaping characters and specifying progression sequences

    How can I combine the escaping of a search string and the specification of progression sequences within an oracle text query
    so that in all cases the correct results are delivered (see example below)?
    The scenario in which to use this is the following:
    + Database: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0
    + Requirement: Hitlist of results ordered by score whereby the different part within
    the result list are specified using progression sequences within oracle text query
    Example:
    create table service_provider (
    id number,
    name_c varchar(100),
    uri_c varchar(255)
    insert into service_provider values (1,'ABB Company Mgmt','http://www.abb-company-mgmt.de');
    insert into service_provider values (2,'Dr. Abbas Ming','http://www.dr-abbas-ming.de');
    insert into service_provider values (3,'SABBATA United','http://www.sabbata-united.de');
    insert into service_provider values (4,'ABB','http://www.abb.de');
    insert into service_provider values (5,'AND Company Mgmt','http://www.and-company-mgmt.de');
    insert into service_provider values (6,'Dr. Andas Ming','http://www.dr-andas-ming.de');
    insert into service_provider values (7,'SANDATA United','http://www.sandata-united.de');
    insert into service_provider values (8,'AND','http://www.and.de');
    Query 1: works correctly in this case
    select * from (
    select /*+ FIRST_ROWS */ score(1), this_.*
    from service_provider this_
    where
    CONTAINS ( this_.NAME_C , '<QUERY><textquery grammar="CONTEXT">' ||
    '<progression>' ||
    '<seq>abb</seq>' ||
    '<seq>abb%</seq>' ||
    '<seq>%abb%</seq>' ||
    '<seq>fuzzy(abb,1,100,WEIGHT)</seq>' ||
    '</progression></textquery></QUERY>', 1 ) > 0
    order by score(1) desc, this_.NAME_C
    ) where rownum < 21
    delivers
    76     4     ABB     http://www.abb.de
    76     1     ABB Company Mgmt     http://www.abb-company-mgmt.de
    51     2     Dr. Abbas Ming     http://www.dr-abbas-ming.de
    26     3     SABBATA United     http://www.sabbata-united.de
    Query 2: procudes error
    select * from (
    select /*+ FIRST_ROWS */ score(1), this_.*
    from service_provider this_
    where
    CONTAINS ( this_.NAME_C , '<QUERY><textquery grammar="CONTEXT">' ||
    '<progression>' ||
    '<seq>and</seq>' ||
    '<seq>and%</seq>' ||
    '<seq>%and%</seq>' ||
    '<seq>fuzzy(and,1,100,WEIGHT)</seq>' ||
    '</progression></textquery></QUERY>', 1 ) > 0
    order by score(1) desc, this_.NAME_C
    ) where rownum < 21
    produces ORA-29902, ORA-20000, DRG-50901 because AND is a reserved word in oracle text
    So we need escaping ...
    Query 3: does not work correctly
    select * from (
    select /*+ FIRST_ROWS */ score(1), this_.*
    from service_provider this_
    where
    CONTAINS ( this_.NAME_C , '<QUERY><textquery grammar="CONTEXT">' ||
    '<progression>' ||
    '<seq>{abb}</seq>' ||
    '<seq>{abb%}</seq>' ||
    '<seq>{%abb%}</seq>' ||
    '<seq>fuzzy({abb},1,100,WEIGHT)</seq>' ||
    '</progression></textquery></QUERY>', 1 ) > 0
    order by score(1) desc, this_.NAME_C
    ) where rownum < 21
    delivers
    76     4     ABB     http://www.abb.de
    76     1     ABB Company Mgmt     http://www.abb-company-mgmt.de
    Query 4: does not produce an error, but also does not work correctly
    select * from (
    select /*+ FIRST_ROWS */ score(1), this_.*
    from service_provider this_
    where
    CONTAINS ( this_.NAME_C , '<QUERY><textquery grammar="CONTEXT">' ||
    '<progression>' ||
    '<seq>{and}</seq>' ||
    '<seq>{and%}</seq>' ||
    '<seq>{%and%}</seq>' ||
    '<seq>fuzzy({and},1,100,WEIGHT)</seq>' ||
    '</progression></textquery></QUERY>', 1 ) > 0
    order by score(1) desc, this_.NAME_C
    ) where rownum < 21
    delivers
    76     8     AND     http://www.and.de
    76     5     AND Company Mgmt     http://www.and-company-mgmt.de

    Anywhere that you just use the word by itself, enclose it in {}, but anywhere that you add % on either side or both don't enclose it in {}. Please see the demonstration below.
    SCOTT@10gXE> SELECT * FROM v$version
      2  /
    BANNER
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
    PL/SQL Release 10.2.0.1.0 - Production
    CORE     10.2.0.1.0     Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    SCOTT@10gXE> create table service_provider
      2    (id     number,
      3       name_c     varchar(100),
      4       uri_c     varchar(255))
      5  /
    Table created.
    SCOTT@10gXE> insert all
      2  into service_provider values (1,'ABB Company Mgmt','http://www.abb-company-mgmt.de')
      3  into service_provider values (2,'Dr. Abbas Ming','http://www.dr-abbas-ming.de')
      4  into service_provider values (3,'SABBATA United','http://www.sabbata-united.de')
      5  into service_provider values (4,'ABB','http://www.abb.de')
      6  into service_provider values (5,'AND Company Mgmt','http://www.and-company-mgmt.de')
      7  into service_provider values (6,'Dr. Andas Ming','http://www.dr-andas-ming.de')
      8  into service_provider values (7,'SANDATA United','http://www.sandata-united.de')
      9  into service_provider values (8,'AND','http://www.and.de')
    10  into service_provider values (9,'EBB','fuzzy test')
    11  into service_provider values (10,'OND','fuzzy test')
    12  select * from dual
    13  /
    10 rows created.
    SCOTT@10gXE> CREATE INDEX your_index
      2  ON service_provider (name_c)
      3  INDEXTYPE IS CTXSYS.CONTEXT
      4  PARAMETERS ('STOPLIST CTXSYS.EMPTY_STOPLIST')
      5  /
    Index created.
    SCOTT@10gXE> VARIABLE search_string VARCHAR2 (100)
    SCOTT@10gXE> EXEC :search_string := 'abb'
    PL/SQL procedure successfully completed.
    SCOTT@10gXE> COLUMN name_c FORMAT A20 WORD_WRAPPED
    SCOTT@10gXE> COLUMN uri_c  FORMAT A40
    SCOTT@10gXE> select *
      2  from   (select /*+ FIRST_ROWS */ score(1), this_.*
      3            from   service_provider this_
      4            where  CONTAINS
      5                  (this_.NAME_C ,
      6                   '<QUERY>
      7                   <textquery grammar="CONTEXT">
      8                     <progression>
      9                       <seq>{'         || :search_string || '}</seq>
    10                       <seq>'         || :search_string || '%</seq>
    11                       <seq>%'         || :search_string || '%</seq>
    12                       <seq>fuzzy({' || :search_string || '},1,100,WEIGHT)</seq>
    13                     </progression>
    14                  </textquery>
    15                   </QUERY>', 1 ) > 0
    16            order  by score(1) desc, this_.NAME_C)
    17  where  rownum < 21
    18  /
      SCORE(1)         ID NAME_C               URI_C
            76          4 ABB                  http://www.abb.de
            76          1 ABB Company Mgmt     http://www.abb-company-mgmt.de
            51          2 Dr. Abbas Ming       http://www.dr-abbas-ming.de
            26          3 SABBATA United       http://www.sabbata-united.de
             4          9 EBB                  fuzzy test
    SCOTT@10gXE> EXEC :search_string := 'and'
    PL/SQL procedure successfully completed.
    SCOTT@10gXE> /
      SCORE(1)         ID NAME_C               URI_C
            76          8 AND                  http://www.and.de
            76          5 AND Company Mgmt     http://www.and-company-mgmt.de
            51          6 Dr. Andas Ming       http://www.dr-andas-ming.de
            26          7 SANDATA United       http://www.sandata-united.de
             5         10 OND                  fuzzy test
    SCOTT@10gXE>

  • Justification for Using Oracle Text

    Hello,
    Can someone give me good cause (justification) for utilizing Oracle Text over other tools out there that are not tied directly to Oracle?
    Apparently it is possible to identify metadata within text and do keyfield and keyword searches this way with other tools, but I question the accuracy, speed, or value in terms of data relationships with this approach. I feel the relationships belong in the database along with the indexes but can't convince anyone of this.
    Has anyone experience working with Oracle Text where relationships help to drive the search and can give me good cause to this approach?
    thanks

    Hi,
    Justification depends on your use. For starters:
    1) It is included in both standard and enterprise editions of the db at no added charge
    2) Uses SQL to query and maintain
    3) Includes a number of built-ins for maintenance and optimization
    4) It has 4 different index types for various uses
    5) It can index any data type
    6) UltraSearch is included in both standard and enterprise editions of the db at no additional charge (this is a crawler built on Oracle Text).
    As for the integration - it is optimized for Oracle. If you were to build a standalone indexing solution you would probably design it a bit different, but Oracle Text takes into account the optimizer and database structure.
    It has other features (same as some of the other tools) like a knowledge base, classification, clustering, theme extraction, language-specific features, ability to index documents in and out of the database, stopwords, stemming, wildcard, progressive relaxation, and the list goes on.
    I guess my question would be, what is the reason for NOT using it? That might give me a better line on the reasoning so that I can respond with something a bit more specific.
    Thanks,
    Ron

  • Progressive Relaxation with error

    Hi,
    I tried to use progress relaxation to calculate matching scores(between t1.album and t2.title) and store them into a table. However, after executing the following script, I got these errors:
    ERROR at line 1:
    ORA-29902: error in executing ODCIIndexStart() routine
    ORA-20000: Oracle Text error:
    DRG-50901: text query parser syntax error on line 1, column 34
    ORA-06512: at line 26
    And the outer cursor stopped at some point. I've been working on it for many days already, but I still can't figure it out...
    Oh, one more question: what is 'c' in the statement 'for c in (......)'? I got this from http://www.oracle.com/technology/products/text/htdocs/prog_relax.html, but I don't understand what it does...
    Thanks a lot!!!!!!
    Here is the script:
    DECLARE
    max_rows integer := 300000;
    counter integer := 0;
    current_album t1.album%TYPE;
    CURSOR album_cursor IS
         SELECT distinct album FROM t1;
    BEGIN
    OPEN album_cursor;
    LOOP
    FETCH album_cursor INTO current_album;
    EXIT WHEN album_cursor%NOTFOUND;
    for c in (select score(1) scr, aritst, Title from t2 where contains (Title, '
    <query>
    <textquery>'||'{'||current_album||'}'||'
    <progression>
    <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "?{", "}", " "))</rewrite>/seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "OR"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "?{", "}", "OR"))</rewrite></seq>
    </progression>
    </textquery>
    </query>
    ', 1) > 0)
    LOOP
    counter := counter + 1;
    INSERT INTO ALBUM_MATCHED(SEQNUM, SCORE, ARTIST, t2_TITLE, t1_ALBUM)
    VALUES(counter, c.scr, c.artist, c.Title, current_album);
    commit;
    EXIT when counter >= max_rows;
    END LOOP;
    END LOOP;
    CLOSE album_cursor;
    END;
    **************************************************************************************************************************************************

    Hi raford,
    I also suspect that it's a problem caused by special characters. That's why I defined the following skipjoins for the matching column indexes:
    exec CTX_DDL.CREATE_PREFERENCE ('spe_cha_lexer', 'BASIC_LEXER');
    exec CTX_DDL.SET_ATTRIBUTE('spe_cha_lexer', 'SKIPJOINS' , '\,\&\=\{\}\\\(\)\[\]\-\;\~\|\$\!\>\*\%\_''\<\:\?\.\+\/\"@#');
    create index t1_album_idx on t1 (album)
    indextype is ctxsys.context
    parameters ('lexer spe_cha_lexer wordlist wildcard_pref sync (on commit)');
    create index t2_title_idx on amazonData (title)
    indextype is ctxsys.context
    parameters ('lexer spe_cha_lexer wordlist wildcard_pref sync (on commit)');
    Here is the table structures of t1 and t2, and resultset table album_matched:
    create table t1(album varchar2(500));
    create table t2(artist varchar2(500), title varchar2(4000));
    create table album_matched(SEQNUM number, SCORE number, ARTIST varchar2(500), t2_TITLE varchar2(4000), t1_ALBUM varchar2(500));
    Here is some sample data:
    for t1:
    Madeline Porter
    Harry Porter
    ???? R & H ?????
    mandy's candy
    for t2.artist, you can put whatever. and for t2.title:
    Harry Porter
    Basically, you can put everything in t1.album and t2.artist and t2.title, since we downloaded these data from a website. Therefore, there might be a lot of special characters in it, some of which might be miscoded into english from French or some other languages.
    And I found the scoring is not right too...both table contain 'Harry Porter', but the matching score has only 68...don't know why...
    Thanks a lot!

  • Please help explain strange behaviour of progressive relaxation..

    Hello
    I am building theo Oracle text querry and I stumbled on a behaviour which I cannot explain...
    here is the topo:
    I have created a synonym thusly:
    ctx_thes.create_relation('GR_THESAURUS','LEBOURGNEUF','SYN','BOURGNEUF');
    when I issue this select:
    SELECT      SCORE(1) NIVEAU_RECHERCHE, NOM,NO_MATRC,NO_NOM_REGST
    FROM DUMMY
    WHERE CONTAINS(nom, 'SYN(LEBOURGNEUF, GR_THESAURUS)', 1) > 0 ;
    I get the expected result set which containsentries with either 'LEBOURGNEUF' or 'BOURGNEUF'. So far so good.
    Now, when I combine search criterias using progressive relaxation, thus:
    SELECT SCORE(1) NIVEAU_RECHERCHE, DUMMY.NO_MATRC,DUMMY.NO_NOM_REGST,DUMMY.NOM
    FROM DUMMY
    WHERE CONTAINS(nom, '<query>
    <textquery lang="FRENCH" grammar="CONTEXT">LEBOURGNEUF golf
    <progression>
    <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "OR"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "SYN(", ",GR_THESAURUS)", "OR"))</rewrite></seq>
    </progression>
    </textquery>
    <score datatype="INTEGER" algorithm="DEFAULT"/>
    </query>', 1) > 0;
    I do NOT get any results matching synonym 'BOURGNEUF'.. only those with 'LEBOURGNEUF' are returned...
    further, if I intentionaly make a syntax error in the line
    <seq><rewrite>transform((TOKENS, "SYN(", ",GR_THESAURUS)", "OR"))</rewrite></seq>
    say like this:
    <seq><rewrite>transform((TOKENS, "xSYN(", ",GR_THESAURUS)", "OR"))</rewrite></seq>
    no error is returned and I get the same result set...
    so this leads me to conclude that only the first two lines of the query are parsed/executed...
    does anyone here have any ideas what is going one here?
    in the preceding quire I neeed to add
                                                      <seq><rewrite>transform((TOKENS, "SYN(", ",GR_THESAURUS)", "AND"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "SYN(", ",GR_THESAURUS)", "OR"))</rewrite></seq>
    and possibly
    <seq><rewrite>transform((TOKENS, "NT(", ",2,GR_THESAURUS)", "OR"))</rewrite></seq>
    can this be done???
    why is there no errors when I execute the query (in sqldeveloper) ???
    any hints will be greatly appreciated!
    Cheers
    Edited by: user8848610 on 2009-10-29 07:46

    now it works... although the simpler and cleaner solution of using transform would have been perfect, this function does a somewhat adequate job... I put it here so maybe it will help others ;)
         FUNCTION BuildSearchPredicate (texte IN NOM_ASSJT.NOM%TYPE) RETURN VARCHAR2 IS
         sSQL VARCHAR2(5000);
         sSeq1 VARCHAR2(1000);
         sSeq2 VARCHAR2(1000);
         sSeq3 VARCHAR2(1000);
         iFirst NUMBER(1);
         iPosition NUMBER;
         iToken NUMBER;
         CURSOR curWords(line_text IN VARCHAR2)      IS      
                   select regexp_substr(line_text, '[^ ]+', 1, level) word
                   from dual
                   connect by regexp_substr(line_text, '[^ ]+', 1, level) is not null;
         BEGIN
         sSQL := sSQL || '<query><textquery lang="FRENCH" grammar="CONTEXT"><progression> ';
         sSeq1 := '';
         iFirst := 1;
         iToken := 0;
         FOR r_curWord IN curWords(texte)
         LOOP
         iToken := iToken + 1;
         IF iFirst = 0 THEN
                   sSeq1 := sSeq1 || ' AND {' || trim(r_curWord.word) || '}';
                   sSeq2 := sSeq2 || ' OR {' || trim(r_curWord.word) || '}';
                   sSeq3 := sSeq3 || ' OR SYN(' || trim(r_curWord.word) || ',GR_THESAURUS)';
              ELSE
                   sSeq1 := '{' || trim(r_curWord.word) || '}';
                   sSeq2 := '{' || trim(r_curWord.word) || '}';
                   sSeq3 := 'SYN(' || trim(r_curWord.word) || ',GR_THESAURUS)';
                   iFirst := 0;
              END IF;
         END LOOP;
         sSQL := sSQL || '<seq>' || sSeq1 || '</seq>';
         iPosition := instr(sSeq1, ' AND ');
         IF instr(sSeq1, ' AND ',iPosition + 1) > 0 THEN -- we must have at least 2 AND operator for this to make sense
              WHILE iPosition > 0
              LOOP
    IF instr(substr(sSeq1, iPosition + 5), ' AND ') > 0 THEN
    sSQL := sSQL || '<seq>' || substr(sSeq1, iPosition + 5) || '</seq>';
    END IF;
                   iPosition := instr(sSeq1, ' AND ', iPosition + 1);
              END LOOP;
         END IF;
         IF iToken > 1 THEN -- no use in having OR if there is only one word
              sSQL := sSQL || '<seq>' || sSeq2 || '</seq>';
         END IF;
         sSQL := sSQL || '<seq>' || sSeq3 || '</seq>';
         RETURN sSql;
         END BuildSearchPredicate;     
    END GR_RECH;
    this will combine search words using AND and OR and SYN like so:
    SELECT GR_RECH.BuildSearchPredicate('LEBOURGNEUF GOLF') FROM DUAL;
    will result in :
    <query><textquery lang="FRENCH" grammar="CONTEXT"><progression> <seq>{LEBOURGNEUF} AND {GOLF}</seq><seq>{LEBOURGNEUF} OR {GOLF}</seq><seq>SYN(LEBOURGNEUF,GR_THESAURUS) OR SYN(GOLF,GR_THESAURUS)</seq>
    thanks for you help!
    cheers
    gth

  • "MS" reserved word in oracle text query?

    Wondering if anyone has run into the string "MS" behaving as a reserved word in oracle text queries. For example, this specification returns all records from Texas:
    '<query>
    <textquery>
    <progression>
    <seq> TX WITHIN CUSTOMER_STATE </seq>
    </progression>
    </textquery>
    </query>'
    But this one does NOT find any results for Mississippi:
    '<query>
    <textquery>
    <progression>
    <seq> MS WITHIN CUSTOMER_STATE </seq>
    </progression>
    </textquery>
    </query>'
    I've confirmed we have data that should match, and I've tried escaping it with the sequences as described in the SQL docs (I've tried single quotes, pairs of single quotes, braces, and combinations of those) . And trying to find info on the web is tough since all web queries that contain 'MS' bring back tons of Microsoft-relevant information.
    Can anyone nudge me in the right direction for a better google-search, or some materials in these forums (my initial searches here didn't turn anything up either).
    Thanks for any feedback!
    jh

    Wondering if anyone has run into the string "MS" behaving as a reserved word in oracle text queries.Maybe because »MS« is in the default english stoplist?:
    English Default Stoplist.

  • Problems with bound parameters in oracle text queries

    Executing the following query I get strange effects depending on the value I pass for the search string :str ...
    With value "Med" everything works fine and I get the results I have expected.
    But when passing "Tech" as value to the query, the result is ORA-20000 and DRG-50901 (Oracle Text error, syntax error in parser)
    select * from (
    SELECT /*+ FIRST_ROWS */ *
    FROM SERVICE_CATEGORY sCat
    WHERE (
    CONTAINS ( sCat.SERVICE_CATEGORY_C , '<QUERY><textquery grammar="CONTEXT"><progression><seq>{'
    || :str || '}</seq><seq>'
    || :str || '%</seq><seq>%'
    || :str || '%</seq><seq>fuzzy({'
    || :str || '},1,100,WEIGHT)</seq></progression></textquery></QUERY>', 1 ) <> 0 AND
    sCat.SERVICE_TYPE_C IS NULL AND sCat.SERVICE_SPECIALTY_C IS NULL )
    ORDER BY score(1) DESC ) where rownum <= 20
    When passing the search string "Tech" directly to the query without using bound paramters, everthing works fine:
    select * from (
    SELECT /*+ FIRST_ROWS */ *
    FROM SERVICE_CATEGORY sCat
    WHERE (
    CONTAINS ( sCat.SERVICE_CATEGORY_C , '<QUERY><textquery grammar="CONTEXT"><progression><seq>{'
    || 'Tech' || '}</seq><seq>'
    || 'Tech' || '%</seq><seq>%'
    || 'Tech' || '%</seq><seq>fuzzy({'
    || 'Tech' || '},1,100,WEIGHT)</seq></progression></textquery></QUERY>', 1 ) <> 0 AND
    sCat.SERVICE_TYPE_C IS NULL AND sCat.SERVICE_SPECIALTY_C IS NULL )
    ORDER BY score(1) DESC ) where rownum <= 20
    Also, when I use >0 instead of <>0 everthing works fine:
    select * from (
    SELECT /*+ FIRST_ROWS */ *
    FROM SERVICE_CATEGORY sCat
    WHERE (
    CONTAINS ( sCat.SERVICE_CATEGORY_C , '<QUERY><textquery grammar="CONTEXT"><progression><seq>{'
    || 'Tech' || '}</seq><seq>'
    || 'Tech' || '%</seq><seq>%'
    || 'Tech' || '%</seq><seq>fuzzy({'
    || 'Tech' || '},1,100,WEIGHT)</seq></progression></textquery></QUERY>', 1 ) > 0 AND
    sCat.SERVICE_TYPE_C IS NULL AND sCat.SERVICE_SPECIALTY_C IS NULL )
    ORDER BY score(1) DESC ) where rownum <= 20
    Does anybody have an explanation for the strange effect when using a bound parameter in combination with <> 0?

    I don't know why your query using bind variables is giving you a problem but use of literal inside CONTAINS second argument is encouraged anyway over bind variables starting with 10gR2 (unless you are confident enough about the cost and selectivity of your queries to the extent that you can use SQL hint instead). The literal replacement feature introduced in release 9i caused a hard-parse if the literal value changed but starting with 10gR2, at least for CONTAINS, a hard-parse is avoided even if the literal value has changed as long as the cost and selectivity is similar to an existing cursor in the library cache (e.g. within 10%).
    Faisal

  • Oracle Text index hangs(Oracle 11g linux enterprise edition)

    Hi guru,
    One very criticial and showstopper issue coming in Oracle Text Indexing.
    I have table ResourceTable(ResId,Contents blob ,docformat)
    I am creating text index on Contents column by using follwing command:
    create index [IndexName] on [TableName] (contents) indextype is ctxsys.context ('lexer mylex stoplist ctxsys.default_stoplist format column ISDOCFORMAT sync(every "sysdate+1/24") storage my_text_storage memory 200M')parallel 2
    I found there is one document of text/html type which hangs oracle text indexing thread.Oracle doest not give any error message keep using CPU 100% and no progress.
    I then create test table with same stucture and put this corrupted documet record in this table.and did indexing again but its not doing index /not ignoring it and hangs .We have also tried to use timeout feature of inso filter so that if such type of document comes at the time of indexing oracle text indexing process will bypass it after specific time interval but still same issue comes and oracle is not bypassing such faulty document.
    This is realy show stopper issue and any kind of help will be greatly appricited.

    You need to raise an SR with Oracle Support for this, and send them the file which is causing the hang. It should then be easy to investigate the problem and schedule a fix.
    If you don't have a support contract, you could send the file to me and I'll raise a bug. However, if we fix it you won't be able to get the fix until it appears in the next downloadable version.
    - Roger
    roger.ford @ oracle.com

  • Progressive relaxation matches ctxrule

    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    "CORE     10.2.0.1.0     Production"
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
    Is progressive relaxation supported by matches with ctxrule indexes??

    No, you can't use progressive relaxation with CTXRULE.

  • Help needed with oracle text special character search

    Hi all
    Using oracle 11g sql developer 4.0
    I am facing this challenge where Oracle text when it comes to searching text that contains special character.
    This what I have done so far with help of http://www.orafaq.com/forum/t/162229/
      CREATE TABLE "SOS"."COMPANY"
       ( "COMPANY_ID" NUMBER(10,0) NOT NULL ENABLE,
      "COMPANY_NAME" VARCHAR2(50 BYTE),
      "ADDRESS1" VARCHAR2(50 BYTE),
      "ADDRESS2" VARCHAR2(10 BYTE),
      "CITY" VARCHAR2(40 BYTE),
      "STATE" VARCHAR2(20 BYTE),
      "ZIP" NUMBER(5,0)
       ) SEGMENT CREATION IMMEDIATE
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "USERS" ;
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (1,'LSG SOLUTIONS LLC',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (2,'LOVE''S TRAVEL',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (3,'DEVON ENERGY',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (4,'SONIC INC',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (5,'MSCI',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (6,'ERNEST AND YOUNG',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (7,'JOHN DEER',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (8,'Properties@Oklahoma, LLC',null,null,null,null,null);
    Insert into COMPANY (COMPANY_ID,COMPANY_NAME,ADDRESS1,ADDRESS2,CITY,STATE,ZIP) values (9,'D.D.T  L.L.C.',null,null,null,null,null);
       BEGIN
    CTX_DDL.CREATE_PREFERENCE ('your_lexer', 'BASIC_LEXER');
         CTX_DDL.SET_ATTRIBUTE ('your_lexer', 'SKIPJOINS', '.,@-'''); -- to skip . , @ - ' symbols
        END;
      CREATE INDEX my_index2 ON COMPANY(COMPANY_NAME)
         INDEXTYPE IS CTXSYS.CONTEXT PARALLEL
       PARAMETERS ('LEXER your_lexer');   
    SELECT
    company_name
    FROM company
    WHERE CATSEARCH(company.COMPANY_NAME, 'LLC','') > 0
    ORDER BY company.COMPANY_ID;
    output
    company_name
    1 LSG SOLUTIONS LLC
    2 Properties@Oklahoma, LLC
    only return 2 row but should return 3

    I just noticed that I forgot to use an empty stoplist, so I have added that to the revised example below.  Otherwise, it uses a default stoplist that would not index common single-letter words like A and I.
    1. Whtat is Just search on single character 'L'? It give me error.
    Since it uses the NEAR operator, searching for just one letter causes incomplete syntax, asking it to search for L near a missing second value.  So, I have added additional code to allow for just one letter.
    2. How do I do auto refresh on this index on datastore?
    If I add "sync        (on commit)" it does not refresh the previously set token.
    Sync(on commit) does synchronize so that the data is immediately searchable.  You have to either optimize or rebuild or drop and recreate the index to condense the rows in the domain index table.
    3.lastly explanation of
    <seq>NEAR((' || letters_func (:search_string) || '),1,TRUE)</seq>
                      <seq>NEAR((' || letters_func (:search_string) || '),100,TRUE)</seq>
                    <seq>NEAR((' || letters_func (:search_string) || '),100,FALSE)</seq>
    why 100 true and 100 false
    100 is just a default value that I used for the second parameter of near, indicating how close the letters need to be to each other.  True and False are values for the third parameter of near, indicating whether or not the letters must be in the same order or not.  So, it returns the results in the order of first those that are very close to one another and in the same order, then those that may be further away but in the same order, then those that may be further away and in any order.
    SCOTT@orcl12c> CREATE TABLE company_near
      2    (company_id    NUMBER(10,0) NOT NULL ENABLE,
      3      company_name  VARCHAR2(50 BYTE))
      4  /
    Table created.
    SCOTT@orcl12c> SET DEFINE OFF
    SCOTT@orcl12c> BEGIN
      2  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (1,'LSG SOLUTIONS LLC');
      3  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (2,'LOVE''S TRAVEL');
      4  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (3,'DEVON ENERGY');
      5  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (4,'SONIC INC');
      6  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (5,'MSCI');
      7  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (6,'ERNEST AND YOUNG');
      8  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (7,'JOHN DEER');
      9  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (8,'Properties@Oklahoma, LLC');
    10  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (9,'D.D.T  L.L.C.');
    11  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (10,'LSG COMPANY, LLC');
    12  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (11,'LSG STAFFING, LLC');
    13  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (12,'L & S GROUP LLC');
    14  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (13,'L S & G, INC.');
    15  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (14,'L.S.G. PROPERTIES, L.L.C.');
    16  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (15,'LSGS PROPERTIES, LLC');
    17  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (16,'LSQ INVESTORS, L.L.C');
    18  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (17,'LHP SHERMAN/GRAYSON, LLC');
    19  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (18,'Walmart');
    20  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (19,'Wal mart');
    21  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (20,'LSG Property Investments, L.L.C.');
    22  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (21,'1224 S GALVESTON AVE, LLC');
    23  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (22,'1527 S GARY AVE, LLC');
    24  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (23,'FIFTEENTH STREET GRILL');
    25  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (24,'Massa Lobortis LLP');
    26  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (25,'Risus A Inc.');
    27  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (26,'Dollar $ store');
    28  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (27,'L.O.V.E., INC. ');
    29  Insert into COMPANY_NEAR (COMPANY_ID,COMPANY_NAME) values (28,'J-MART LLC ');
    30  END;
    31  /
    PL/SQL procedure successfully completed.
    SCOTT@orcl12c> CREATE OR REPLACE FUNCTION letters_func
      2    (p_string IN VARCHAR2)
      3    RETURN        VARCHAR2
      4  AS
      5    v_string     VARCHAR2(4000);
      6  BEGIN
      7    FOR i IN 1 .. LENGTH (p_string)
      8    LOOP
      9       IF REGEXP_LIKE (SUBSTR (p_string, i, 1), '[A-Z]', 'i')
    10       THEN
    11         v_string := v_string || SUBSTR (p_string, i, 1) || ',';
    12       END IF;
    13    END LOOP;
    14    v_string := RTRIM (v_string, ',');
    15    RETURN v_string;
    16  END letters_func;
    17  /
    Function created.
    SCOTT@orcl12c> BEGIN
      2    CTX_DDL.CREATE_PREFERENCE ('letters_datastore', 'MULTI_COLUMN_DATASTORE');
      3    CTX_DDL.SET_ATTRIBUTE
      4       ('letters_datastore',
      5        'COLUMNS',
      6        'letters_func (company_name) company_name');
      7    CTX_DDL.SET_ATTRIBUTE ('letters_datastore', 'DELIMITER', 'NEWLINE');
      8  END;
      9  /
    PL/SQL procedure successfully completed.
    SCOTT@orcl12c> CREATE INDEX letters_index ON company_near (company_name)
      2  INDEXTYPE IS CTXSYS.CONTEXT
      3  PARAMETERS
      4    ('DATASTORE  letters_datastore
      5       STOPLIST   CTXSYS.EMPTY_STOPLIST
      6       SYNC        (ON COMMIT)')
      7  /
    Index created.
    SCOTT@orcl12c> SELECT COUNT(*) FROM dr$letters_index$i
      2  /
      COUNT(*)
            24
    1 row selected.
    SCOTT@orcl12c> VARIABLE search_string VARCHAR2(100)
    SCOTT@orcl12c> EXEC :search_string := 'LSG'
    PL/SQL procedure successfully completed.
    SCOTT@orcl12c> SELECT SCORE(1), company_id, company_name
      2  FROM   company_near
      3  WHERE  CONTAINS
      4            (company_name,
      5             '<query>
      6            <textquery>
      7              <progression>
      8                <seq>'       || :search_string            || '</seq>
      9                <seq>NEAR((' || letters_func (:search_string) || '),1,TRUE)</seq>
    10                <seq>NEAR((' || letters_func (:search_string) || '),100,TRUE)</seq>
    11                <seq>NEAR((' || letters_func (:search_string) || '),100,FALSE)</seq>
    12              </progression>
    13            </textquery>
    14             </query>',
    15             1) > 0
    16  ORDER  BY SCORE(1) DESC
    17  /
      SCORE(1) COMPANY_ID COMPANY_NAME
            56          1 LSG SOLUTIONS LLC
            56         10 LSG COMPANY, LLC
            56         11 LSG STAFFING, LLC
            56         12 L & S GROUP LLC
            56         13 L S & G, INC.
            56         14 L.S.G. PROPERTIES, L.L.C.
            56         20 LSG Property Investments, L.L.C.
            56         15 LSGS PROPERTIES, LLC
            31         17 LHP SHERMAN/GRAYSON, LLC
             8         21 1224 S GALVESTON AVE, LLC
             4         22 1527 S GARY AVE, LLC
             4         23 FIFTEENTH STREET GRILL
    12 rows selected.
    SCOTT@orcl12c> EXEC :search_string := 'L'
    PL/SQL procedure successfully completed.
    SCOTT@orcl12c> /
      SCORE(1) COMPANY_ID COMPANY_NAME
            78          1 LSG SOLUTIONS LLC
            77          8 Properties@Oklahoma, LLC
            77          9 D.D.T  L.L.C.
            77         10 LSG COMPANY, LLC
            77         11 LSG STAFFING, LLC
            77         12 L & S GROUP LLC
            77         28 J-MART LLC
            77          2 LOVE'S TRAVEL
            77         26 Dollar $ store
            77         24 Massa Lobortis LLP
            77         23 FIFTEENTH STREET GRILL
            77         14 L.S.G. PROPERTIES, L.L.C.
            77         15 LSGS PROPERTIES, LLC
            77         16 LSQ INVESTORS, L.L.C
            77         17 LHP SHERMAN/GRAYSON, LLC
            77         20 LSG Property Investments, L.L.C.
            77         21 1224 S GALVESTON AVE, LLC
            77         22 1527 S GARY AVE, LLC
            76         19 Wal mart
            76         18 Walmart
            76         27 L.O.V.E., INC.
            76         13 L S & G, INC.
    22 rows selected.
    SCOTT@orcl12c> INSERT INTO company_near (company_id, company_name) VALUES (30, 'Laris Gordman llc.'  )
      2  /
    1 row created.
    SCOTT@orcl12c> COMMIT
      2  /
    Commit complete.
    SCOTT@orcl12c> SELECT COUNT(*) FROM dr$letters_index$i
      2  /
      COUNT(*)
            35
    1 row selected.
    SCOTT@orcl12c> EXEC :search_string := 'Laris Gordman llc.'
    PL/SQL procedure successfully completed.
    SCOTT@orcl12c> SELECT SCORE(1), company_id, company_name
      2  FROM   company_near
      3  WHERE  CONTAINS
      4            (company_name,
      5             '<query>
      6            <textquery>
      7              <progression>
      8                <seq>NEAR((' || letters_func (:search_string) || '),1,TRUE)</seq>
      9                <seq>NEAR((' || letters_func (:search_string) || '),100,TRUE)</seq>
    10                <seq>NEAR((' || letters_func (:search_string) || '),100,FALSE)</seq>
    11              </progression>
    12            </textquery>
    13             </query>',
    14             1) > 0
    15  ORDER  BY SCORE(1) DESC
    16  /
      SCORE(1) COMPANY_ID COMPANY_NAME
           100         30 Laris Gordman llc.
    1 row selected.
    SCOTT@orcl12c> EXEC CTX_DDL.OPTIMIZE_INDEX ('letters_index', 'FULL')
    PL/SQL procedure successfully completed.
    SCOTT@orcl12c> SELECT COUNT(*) FROM dr$letters_index$i
      2  /
      COUNT(*)
            24
    1 row selected.

  • Oracle Text/PL SQL errors

    Is anyone familiar with this error. I have removed all the problem characters and words that may cause problems so it is not that.
    [1]: (Error): ORA-20000: Oracle Text error: DRG-50901: text query parser syntax error on line 1, column 1 ORA-06512: at line 3
    BEGIN
    for rec in (select COMMENTS,FAILURE_REASON from COMMENTS7105) loop
    update COMMENTS7105
    set "CATEGORY" = CASE
    when rec.FAILURE_REASON not in (select distinct tmocategory from categories)
    then (select "CATEGORY" from (select "CATEGORY",SCORE(1) SCORE from CATEGORIES where contains(SUBCATEGORY, '
    <query>
    <textquery lang = "ENGLISH" grammar = "CONTEXT">'||rec.comments||'
    <progression>
    <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "NEAR"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
    </progression>
    </textquery>
    <score datatype = "INTEGER" algorithm = "COUNT" />
    </query>', 1) <> 0
    and SCORE(1) > 1
    order by SCORE(1) desc)
    where rownum = 1)
    when rec.FAILURE_REASON in (select distinct tmocategory from categories)
    then (select "CATEGORY" from (select "CATEGORY",SCORE(1) SCORE from CATEGORIES where contains(SUBCATEGORY, '
    <query>
    <textquery lang = "ENGLISH" grammar = "CONTEXT">'||rec.comments||'
    <progression>
    <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "NEAR"))</rewrite></seq>
    <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
    </progression>
    </textquery>
    <score datatype = "INTEGER" algorithm = "COUNT" />
    </query>', 1) <> 0
    and SCORE(1) > 1
    and TMOCATEGORY = rec.FAILURE_REASON
    order by SCORE(1) desc)
    where rownum = 1)
    else 'Unknown' end
    where COMMENTS LIKE '%'||rec.COMMENTS||'%';
    end loop;
    END;
    Can someone please help me. Any help is greatly appreciated.

    Duplicate post answered on Text forum:
    Categorizing Data with Oracle Text

  • Search inside sections with progressive relaxation

    Hi,
    I am trying to search for the keywords within the XML. So my search will be made on a particular sections inside the XML. Say, i will search for the keyword Dog inside the tag <Animal>.
    My questions are,
    1. Is there any other way we can do it without using the within operator?
    2. If we are using within, will i be able to apply the progressive relaxation in the search keywords?
    3. Also, what is the use of SDATA. if i am using sdata, do i define all the tags in the XML (the tags in the XML are not generic and it may vary for each XML)?
    Thanks in advance.
    Regards,
    Loganathan

    I am trying to search for the keywords within the XML. So my search will be made on a particular sections inside the XML. Say, i will search for the keyword Dog inside the tag <Animal>.
    1. Is there any other way we can do it without using the within operator?Not that I know of. If you search without the within operator, then it would find the word in any tag.
    2. If we are using within, will i be able to apply the progressive relaxation in the search keywords?Yes.
    3. Also, what is the use of SDATA. if i am using sdata, do i define all the tags in the XML (the tags in the XML are not generic and it may vary for each XML)?Sdata is for structured data, not unstructured text data. The sdata needs to be in a separate column. If your tags are variable, then you can use ctxsys.auto_section_group.
    A lot of what you are asking about was discussed and demonstrated in the following recent thread:
    Query Templates and WITHIN

  • How do I get Oracle Text to index files on a file server?

    I am new to Oracle (I'm a MS-SQL DBA looking for a Full-Text Search solution that is better than linking to a MS index server.)
    So - Here's the objective:
    I have Oracle Server(Express) installed on a Windows server.
    I would like for Oracle to build a Full-Text Catalog of the files on a separate file server based on file paths in a table in the database.
    (No desire to store terabytes of images and documents inside the database)
    I can get Oracle text up and running, using the URL_Datastore:
    CREATE TABLE files (id NUMBER PRIMARY KEY, issue_id NUMBER, path VARCHAR(255) UNIQUE, ot_format VARCHAR(6), ot_version VARCHAR(10));
    The Compaq server is a remote windows server on my local workgroup, so the fully qualified path is just "compaq" and the URL is valid:
    INSERT INTO files VALUES (9,9,'file://Compaq/FTQ/00000003.pdf',NULL,NULL);
    INSERT INTO files VALUES (13,13,'file://Compaq/FTQ/01.txt',NULL,NULL);
    CREATE INDEX file_index ON files(path) INDEXTYPE IS ctxsys.context
    PARAMETERS ('datastore ctxsys.URL_DATASTORE format column ot_format');
    but when I enter:
    Select * from CTX_User_Index_errors, I see the following errors:
    DRG-11609: URL store: unable to open local file specified by file://Compaq/FTQ/00000003.pdf
    DRG-11609: URL store: unable to open local file specified by file://Compaq/FTQ/01.txt
    Did I miss something?
    Do I need to install anything on the file server?
    I would like to convince my company that Oracle can be much quicker than Microsoft's Indexing Service because it can avoid joining two large result sets (one result set from Full_text (indexing service) and one for specific data contained in fields in the MS-SQL database.) Full Text Searches commonly take 40 - 60 seconds where there are 1.5 million multi-page PDF files for a particular set that I sample search on. Without this massive join, I believe I can get the search to run in under 10 seconds.

    Thank you!
    File_Datastore worked fine.
    I was staying away from File_Datastore because the information I gathered from googling suggested that file_datastore would only work locally.
    Now I just have to get Oracle to pull data out of tables in a MS-SQL database on the local network (don't have a clue yet), and then have it index compiled file paths.
    Then MS-SQL can query Oracle with index and full-text criteria and Oracle can send back a result set
    It may sound like a bad way of performing Full-Text Queries, but anything will be better than the way things are currently running. We are currently performing Full Text Searches on a table that is rebuilt nightly, so the table containing millions of file paths is not live..
    It would be so much better if we just migrated to Oracle, but we currently do not have the resources.

  • Error while running the Oracle Text optimize index procedure (even as a dba user too)

    Hi Experts,
    I am on Oracle on 11.2.0.2  on Linux. I have implemented Oracle Text. My Oracle Text indexes are fragmented but I am getting an error while running the optimize_index error. Following is the error:
    begin
      ctx_ddl.optimize_index(idx_name=>'ACCESS_T1',optlevel=>'FULL');
    end;
    ERROR at line 1:
    ORA-20000: Oracle Text error:
    ORA-06512: at "CTXSYS.DRUE", line 160
    ORA-06512: at "CTXSYS.CTX_DDL", line 941
    ORA-06512: at line 1
    Now I tried then to run this as DBA user too and it failed the same way!
    begin
      ctx_ddl.optimize_index(idx_name=>'BVSCH1.ACCESS_T1',optlevel=>'FULL');
    end;
    ERROR at line 1:
    ORA-20000: Oracle Text error:
    ORA-06512: at "CTXSYS.DRUE", line 160
    ORA-06512: at "CTXSYS.CTX_DDL", line 941
    ORA-06512: at line 1
    Now CTXAPP role is granted to my schema and still I am getting this error. I will be thankful for the suggestions.
    Also one other important observation: We have this issue ONLY in one database and in the other two databases, I don't see any problem at all.
    I am unable to figure out what the issue is with this one database!
    Thanks,
    OrauserN

    How about check the following?
    Bug 10626728 - CTX_DDL.optimize_index "full" fails with an empty ORA-20000 since 11.2.0.2 upgrade (DOCID 10626728.8)

  • Getting error while importing schema with ORACLE TEXT

    IMP-00003: ORACLE error 20000 encountered
    ORA-20000: Oracle Text error:
    DRG-52204: error while registering index
    DRG-10507: duplicate index name: WORKORDER_Q, owner: SYS
    ORA-06512: at "CTXSYS.DRUE", line 160
    ORA-06512: at "CTXSYS.DRIIMP", line 115
    ORA-06512: at line 2
    IMP-00088: Problem importing metadata for index WORKORDER_Q. Index creation will be skipped
    Database version - Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
    Os version - Linux nlxs1012.slb.atosorigin-asp.com 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
    We have take export of schema from production db now importing data to qa environment..
    In import facing above error..

    I am importing objects from P20_MAXIMO to Q25_MAXIMO to another database..
    Below is import par file..
    USERID='/ as sysdba'
    FILE=exp_P20_MAXIMO_C2364781.dmp
    LOG=imp_P20_MAXIMO__Q25_MAXIMO_C2364781_1.log
    FROMUSER=P20_MAXIMO
    TOUSER=Q25_MAXIMO
    buffer=1000000
    feedback=100000
    Export parfile
    userid='/ as sysdba'
    owner=P20_MAXIMO
    FILE=exp_P20_MAXIMO_C2364781.dmp
    LOG=exp_P20_MAXIMO_C2364781.log
    buffer=10000000
    feedback=100000
    statistics=none

Maybe you are looking for

  • Unable to see the variable in Query Designer

    Hello Experts, I am running one report and it is showing me 0calday variable selection screen at run time. I am unable to see this Variable on my Query designer but when I am opening query properties its showing me in this. Kindly let me know where i

  • ITunes stuck on "Waiting for changes to be applied"

    Here are the symptoms I'm seeing: - If I restore my phone, or delete/reinstall iTunes, or uncheck "Sync Music", wait for a sync to complete, recheck "Sync Music", ONE sync attempt will complete. I try adding one additional song and re-syncing the dev

  • Communication channel is failing

    hai friends the communication channel is failing as it is not able to pick a field it is showing the error as follows Message processing failed. Cause: com.sap.aii.af.ra.ms.api.RecoverableException: Error during variable substitution: com.sap.aii.ada

  • Recovering deleted photos in Bridge CS6

    I uploaded photos from a CF card through Bridge CS6 to a portable hard drive.  I was unaware that the drive had lost its connection when I transferred the photos.  I let Bridge delete the photos from the card before realizing that the drive was not f

  • Muse creates .php files instead .html files when directly uploaded on host in program

    When i use reCaptcha in Adobe Muse it creates index.php files when i click upload on ftp host. If i export it as html, then it works correctly. For my own Website it's not a problem (Hoststar.ch), but it appears to be a problem for other hosting prov