sql >> データベース >  >> RDS >> Oracle

複数のテーブルと結合に対するOracleテキスト検索

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



    1. Webアプリケーションのセキュリティの脆弱性のテスト:ベストプラクティス?

    2. SQLLIKEステートメントで変数を使用する

    3. SQLSELECTで特定の値を持つレコードを除外する方法

    4. Active Recordに一括挿入するために作成されたIDのリストを取得するにはどうすればよいですか?