sql >> Databasteknik >  >> RDS >> Oracle

Oracle-textsökning på flera tabeller och sammanfogningar

Jag brukar lösa fulltextsökningar på flera kolumner i olika tabeller genom att materialisera en strukturerad XML-vy av dem och sedan skapa indexet på hela XML.

Denna lösning är generisk och ger dig också frihet vid sökning:hela vyn eller bara en undersökväg. Nackdelen är att hantera uppdateringen av en MV som vanligtvis inte kan uppdateras snabbt; men uppdatering av fulltextindex är vanligtvis inte heller i realtid, så du kan bara schemalägga det.

-- 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. MySQL välj med CONCAT-villkor

  2. Hur man checkar in en annan tabell har inga data när man gör mysql join?

  3. Snabbaste sättet att avgöra om posten finns

  4. Hur man ändrar bakgrundsfärgen för ett formulär i Access 2016