2013-10-20 86 views
2

我有以下SQL語句。在多個表和連接上進行Oracle文本搜索

select emp_no,dob,dept_no from v_depts 
where catsearch (emp_no,'abc',NULL) > 0 
or 
catsearch (dept_no,'abc',NULL) > 0 

其中v_depts是視圖。

現在我想添加一個或多個表作爲連接,以便我可以在列 employee_details包含員工信息,我可以用emp_no

我已經創建的索引上employee_detailsemp_name列加入,但我不能與v_depts加入搜索,因爲我修改我的SQL語句作爲

select a.emp_no,a.dob,a.dept_no from v_depts a left outer join employee_details b 
on (a.emp_no = b.emp_no) 
where catsearch (a.emp_no,'abc',NULL) > 0 
or 
catsearch (a.dept_no,'abc',NULL) > 0 
or 
catsearch (b.emp_name,'abc',NULL) > 0 

它給了我錯誤

ORA-20000: Oracle Text error: 
DRG-10849: catsearch does not support functional invocation 
DRG-10599: column is not indexed 
即使我已經在 employee_details表創造了EMP_NAME列索引

。我怎麼解決這個問題?

爲EMP_NAME

CREATE INDEX IDX_EMP_DETAILS ON EMPLOYEE_DETAILS(EMP_NAME)INDEXTYPE IS CTXSYS.CTXCAT 
+0

你怎麼沒有得到'列明確定義'錯誤?在'SELECT'列表的查詢中'emp_no'之前沒有表別名前綴,並且'emp_no'作爲參數傳遞給'catsearch'。你確定你得到的錯誤是由'catsearch(b.emp_name,'abc',NULL)> 0'造成的嗎?如果你刪除該行,它是否工作? –

+0

@PrzemyslawKruglej我修改了問題並添加了別名,在輸入問題時錯過了。如果我刪除'catsearch(b.emp_name,'abc',NULL)> 0',那麼它確實返回結果。 – user75ponic

+0

您可以添加您爲創建emp_name列的索引而創建的CREATE INDEX語句嗎? –

回答

4

指數說法我通常這些目標實現的一個結構化的XML視圖,然後創建對整個XML索引解決對不同表的多個列的全文搜索。

該解決方案是通用的,並且還爲您提供搜索自由:整個視圖或僅子路徑。缺點是管理通常無法快速刷新的MV的刷新;但是全文索引的更新通常也不是實時的,所以你可以調整它。

-- Crating the view 
CREATE MATERIALIZED VIEW fulltext_helper 
NOLOGGING 
BUILD DEFERRED 
REFRESH COMPLETE ON DEMAND 
AS 
SELECT 
    a.dob, -- we don't need to fulltext on him 
    XMLELEMENT(helper, 
    XMLFOREST(a.emp_no AS emp_no, 
       a.dept_no AS dept_no, 
       b.emp_name AS emp_name) 
    ) AS indexme 
FROM v_depts a 
LEFT OUTER JOIN employee_details b 
ON (a.emp_no = b.emp_no); 

-- Creating the index 
BEGIN 
    ctx_ddl.create_preference('fulltext_helper_lexer', 'BASIC_LEXER'); 
    ctx_ddl.create_preference('fulltext_helper_filter', 'NULL_FILTER'); 
END; 
/
CREATE INDEX fulltext_helper_index ON fulltext_helper (indexme) 
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS (
    'DATASTORE CTXSYS.DIRECT_DATASTORE 
    LEXER fulltext_helper_lexer 
    FILTER fulltext_helper_filter'); 

-- Searching the whole data 
SELECT * FROM fulltext_helper 
WHERE contains(indexme, '{abc} INPATH (/helper)') > 0; 

-- Searching only on "empno" 
SELECT * FROM fulltext_helper 
WHERE contains(indexme, '{abc} INPATH (/helper/emp_no)') > 0; 
+0

XML視圖如何幫助文本搜索以及它與普通實體化視圖的區別?謝謝 – user75ponic

+0

我想問的另一個問題是,當創建MV時,我應該添加emp_no,dob,dept_no等。作爲附加列,以便當我檢索記錄時,我可以選擇這些列?或者我應該加入主鍵爲了從表中獲取這些列?哪一個更好? – user75ponic

+1

XML使您可以在數據上保留一個結構並選擇只在字符串條件下進行搜索的位置:在上例中,我們有一個簡單的單層XML,但可能是一個複雜的樹,您需要搜索整個子樹。 – dbra