Oracle-需要使用CONTAINS查找包含句点的字符串

时间:2018-11-26 19:22:52

标签: oracle indexing escaping contains

我在表中有一个域索引的字段,因此我可以在查询中使用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

1 个答案:

答案 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';