Oracle

Oracle“匹配”多個列

  • July 8, 2016

我正在開發一個 Web 服務,其中給出了一個搜尋詞,然後我從員工表中返回所有匹配項。在 MySQL 中,我曾經執行以下操作:

SELECT * FROM employees WHERE MATCH(name, lastname, nickname) AGAINST('billy jops');

該查詢在員工表的名稱、姓氏或描述列中查找與“billy jops”、“billy”或“jops”匹配的記錄。

現在我需要在 Oracle 中模擬這種搜尋模式,或者至少更接近一點。


匹配 SQL 查詢

我已經閱讀了Querying with Oracle Text,並且看起來MATCHES SQL Query是我需要的。但是,看起來搜尋索引僅應用於唯一列:

create table queries (
     query_id      number,
     query_string  varchar2(80)
   );

   insert into queries values (1, 'oracle');
   insert into queries values (2, 'larry or ellison');
   insert into queries values (3, 'oracle and text');
   insert into queries values (4, 'market share');

   create index queryx on queries(query_string)
     indextype is ctxsys.ctxrule;

   select query_id from queries
    where matches(query_string, 
                  'Oracle announced that its market share in databases 
                   increased over the last year.')>0

此查詢將返回查詢 1(單詞 oracle 出現在文件中)和 4(片語市場份額出現在文件中),但不返回 2(單詞 larry 和單詞 ellison 都沒有出現,而不是 3(沒有文本在文件中,因此它與查詢不匹配)。

您能否讓我知道如何調整此查詢以與多個列兼容?

一種方法是使用MULTI_COLUMN_DATASTORE。下面是一個例子:

drop table t1 purge;

create table t1 (column1 varchar2(100), column2 varchar2(100));
insert into t1 values ('HELLO', 'WORLD');
insert into t1 values ('SAY', 'HELLO');
insert into t1 values ('SOMETHING', 'ELSE');
insert into t1 values ('WORLD', 'CUP');
commit;

使用所需列創建數據儲存:

begin
ctx_ddl.create_preference('t1_multi_column_datastore', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('t1_multi_column_datastore', 'columns', 'column1, column2');
end;
/

使用此數據儲存創建 Text 索引:

create index i1 on t1 (column1) indextype is ctxsys.context
 parameters ('datastore t1_multi_column_datastore');

或者,如果您希望在送出時維護索引:

create index i1 on t1 (column1) indextype is ctxsys.context
 parameters ('datastore t1_multi_column_datastore sync(on commit)');

搜尋單詞 HELLO 或 WORLD:

select * from t1 where contains (column1, 'HELLO or WORLD') > 0;

COLUMN1    COLUMN2  
---------- ----------
HELLO      WORLD     
SAY        HELLO     
WORLD      CUP     

請注意,您不需要指定查詢中的所有列,但需要指定單詞之間的運算符。

引用自:https://dba.stackexchange.com/questions/143268