【问题标题】:How can I do a CTXSYS.CONTEXT full text search of a table that I am accessing over an Oracle database link?如何对通过 Oracle 数据库链接访问的表进行 CTXSYS.CONTEXT 全文搜索?
【发布时间】:2015-01-07 11:07:51
【问题描述】:

我有一个模式,其中包含通过数据库链接连接的表的同义词(因为其他模式具有不同的 SID)。该表包含一个 CTX.CONTEXT 索引。当我尝试运行如下查询时

select * from my_table c 
    where CTXSYS.CONTAINS(c.index_col, ' [ {ant} ]  ', 1) > 0 

我得到这个错误:

ORA-20000: Oracle Text error:
DRG-10599: column is not indexed

但是,如果我在表的架构中运行相同的查询,我会得到结果。事实证明,不能通过数据库链接调用 CTXSYS.CONTAINS。如何使用同义词进行全文搜索?

【问题讨论】:

    标签: oracle full-text-search synonym


    【解决方案1】:

    我在很多地方寻找答案。一篇文章建议创建一个函数来获取一行的 CONTEXT 分数并返回它。但是,这很慢,因为该函数每行运行一次查询。

    因此,我创建了以下程序包,它将运行一次搜索,然后缓存分数,从而非常快速地获得结果。

    create or replace
    PACKAGE SEARCH_PKG AS
      TYPE t_scores IS TABLE OF NUMBER INDEX BY pls_integer;
      TYPE t_scores_by_search IS TABLE of t_scores INDEX BY VARCHAR2(1000);
      TYPE t_searches_done IS TABLE of BOOLEAN INDEX BY VARCHAR2(1000);
    
      FUNCTION search(i_unique_id NUMBER, i_text VARCHAR2) RETURN NUMBER;
    
    END;
    /
    
    create or replace
    PACKAGE BODY SEARCH_PKG AS
    
      search_scores t_scores_by_search;
      searches_done t_searches_done;
    
      FUNCTION search(i_unique_id NUMBER, i_text VARCHAR2) RETURN NUMBER
      IS
      BEGIN   
    
        IF searches_done.exists(i_text) = FALSE THEN
          FOR c1 IN (SELECT score(1) text_score, my_table_id FROM my_table WHERE contains(index_col, i_text, 1) > 0)
          LOOP
            search_scores(i_text)(c1.my_table_id) := c1.text_score;
          END LOOP;
        END IF;
    
        searches_done(i_text) := TRUE;
    
        IF search_scores.exists(i_text) AND search_scores(i_text).exists(i_unique_id)  THEN
          RETURN search_scores(i_text)(i_unique_id);
        ELSE
          RETURN 0;
        END IF;
      END;
    END SEARCH_PKG;
    /
    

    然后您可以运行如下查询来进行全文搜索:

    SELECT * FROM my_table WHERE search_pkg.search(my_table_id, ' [ {ant} ]  ') > 0 
    

    请注意,每次执行不同的搜索,都会存储更多数据。因此,如果您有长时间运行的连接,您可能需要在包中创建另一个过程来清除数据结构。

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 2019-08-18
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2010-09-19
      • 2021-07-23
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多