我在表中有一个域索引的字段,因此我可以在查询中使用CONTAINS。我正在尝试创建一个查询,该查询可以准确找到首字母缩写词(即J.A.V.A.)。问题是句号“。”是一个被忽略的停用词。我需要弄清楚如何通过转义'。不知何故。我在网上找不到有关如何执行此操作的参考,或者我可能还没有完全理解自己正在阅读的内容。
我尝试过
SELECT * FROM table WHERE CONTAINS(CLOB_column, '{J.A.V.A}')>0;
SELECT * FROM table WHERE CONTAINS(CLOB_column, '{J_A_V_A_}')>0;
SELECT * FROM table WHERE CONTAINS(CLOB_column, '{J\.A\.V\.A\.}')>0;
我通过以下方式创建域索引: CREATE INDEX table_txt_idx ON table(CLOB_column)INDEXTYPE IS CTXSYS.CONTEXT;
我看到了有关附加到索引的某些事情(https://oracle-base.com/articles/9i/full-text-indexing-using-oracle-text-9i)(https://docs.oracle.com/database/121/CCREF/csql.htm#CCREF0100),但我认为它不适用于ctxsys索引,但是我不确定。我只知道我用的没用。
BEGIN
CTX_DLL.OPTIMIZE_INDEX('IDX_COLUMN_TXT','FAST');
END;
这没有提到ctxsys(https://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#BEIIEAFD)
我已经使用LIKE和REGEXP_INSTR创建了类似的查询,并且需要使用CONTAINS创建相同的查询,因此我可以确保我运行最快的查询。
SELECT * from table WHERE CLOB_column LIKE '%J.A.V.A.%'; --4.441 seconds
SELECT * from table WHERE REGEXP_INSTR(CLOB_column, '(J\.A\.V\.A\.)')>0; --23.528 seconds
答案 0 :(得分:1)
您为什么不能使用LIKE?
CREATE TABLE suppliers
( supplier_id number(10) NOT NULL,
supplier_name varchar2(50) NOT NULL
);
INSERT INTO suppliers (supplier_id, supplier_name) VALUES (5000, 'Apple');
INSERT INTO suppliers (supplier_id, supplier_name) VALUES (5000, 'J.A.V.A');
SELECT * FROM suppliers WHERE supplier_name LIKE '%.%';
SELECT * FROM suppliers WHERE supplier_name LIKE 'J.A.V.A';