2017-01-03 62 views
0

我有一個需要爲通過Oracle APEX應用程序進行全文搜索啓用3列的表。我如何爲所有三列創建一個索引,以便它們都可以被搜索?爲上下文全文搜索索引同一個表的多個列?

目前我有一列(STOP_NAME)上下文索引:

DECLARE 

    l_query VARCHAR2(4000); 

BEGIN 

    l_query:= 
    'select 
    "BUS_STOP_ID", 
    "STOP_NAME", 
    "DESC_NOTES", 
    "BUS_NUMBERS", 
    "LOCATION" 
    from "BUS_STOPS" '; 

    IF v('P2_REPORT_SEARCH') IS NOT NULL THEN 
    l_query := l_query||' '||' 
    where 
    ( 
    CONTAINS(STOP_NAME, ''$'|| v('P2_REPORT_SEARCH') ||''') > 0 
    ) 
    '; 
    END IF; 

    RETURN l_query; 

END; 

但我怎麼能創建使用三列(stop_name,desc_notes,bus_numbers)文本搜索索引?我試着用標準指數使用3列上創建,但它沒有工作:

CREATE INDEX bus_stops_ctx_idx 
ON bus_stops (stop_name, bus_numbers, desc_notes) 
INDEXTYPE IS ctxsys.context; 
+2

SQL注入警報!試試這個:'CONTAINS(STOP_NAME,''''||:P2_REPORT_SEARCH)> 0' –

回答

0

第一步是創建一個索引偏好:

BEGIN 
ctx_ddl.create_preference('my_multi_idx', 'MULTI_COLUMN_DATASTORE'); 
ctx_ddl.set_attribute('my_multi_idx', 'COLUMNS', 'stop_name, desc_notes, bus_numbers'); 
END; 

其次是創建使用預先設置的偏好指數本身:

CREATE INDEX bus_stops_ctx_idx 
ON bus_stops(stop_name) 
INDEXTYPE IS CTXSYS.CONTEXT 
PARAMETERS ('DATASTORE my_multi_idx SYNC (ON COMMIT)');