私は通常、異なるテーブルの複数の列に対する全文検索を、それらの構造化された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;