Oracle
Oracle“匹配”多個列
我正在開發一個 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
請注意,您不需要指定查詢中的所有列,但需要指定單詞之間的運算符。