Oracle Text使用Multi_Column_Datastore时为何索引列名?如何规避?
Oracle Text多列索引避免索引列名的解决方法
问题现象
使用Oracle Text的MULTI_COLUMN_DATASTORE配置多列索引后,发现列名(如EMP、NAME、DESIGNATION)被意外索引,导致搜索'%emp%'返回全部表记录,不符合预期需求。
复现步骤
- 创建示例表
CREATE TABLE SAMPLE_TABLE ( EMP_NO VARCHAR2(100) ,EMP_NAME VARCHAR2(100) ,EMP_DESIGNATION VARCHAR2(1000) );
- 插入测试数据
INSERT INTO SAMPLE_TABLE VALUES ('1','John Doe','Consultant'); INSERT INTO SAMPLE_TABLE VALUES ('2','Jane Doe','Contractor'); INSERT INTO SAMPLE_TABLE VALUES ('3','John Smith','Manager'); COMMIT;
- 创建多列数据存储偏好
begin ctx_ddl.drop_preference ( 'MY_DATASTORE' ); ctx_ddl.create_preference('MY_DATASTORE','MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('MY_DATASTORE', 'columns', 'EMP_NO, EMP_NAME, EMP_DESIGNATION'); end; /
- 创建Text索引
CREATE INDEX SAMPLE_TABLE_IDX1 ON SAMPLE_TABLE (EMP_NO) INDEXTYPE IS ctxsys.context PARAMETERS ('datastore MY_DATASTORE SYNC (ON COMMIT)');
- 测试查询
- 搜索
'%Do%'返回2条符合预期的记录; - 搜索
'%emp%'返回全部3条记录; - 查看索引表
DR$SAMPLE_TABLE_IDX1$I的TOKEN_TEXT字段,可见EMP、NAME、DESIGNATION等列名被作为token索引。
解决方法
MULTI_COLUMN_DATASTORE默认使用COLUMN格式(即列名:列值的形式拼接内容),因此列名会被纳入索引。只需将格式设置为TEXT,即可让Oracle Text仅索引列值,不包含列名。
修改后的配置步骤
- 重新创建多列数据存储偏好,添加
FORMAT属性设置为TEXT:
begin ctx_ddl.drop_preference ( 'MY_DATASTORE' ); ctx_ddl.create_preference('MY_DATASTORE','MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('MY_DATASTORE', 'columns', 'EMP_NO, EMP_NAME, EMP_DESIGNATION'); ctx_ddl.set_attribute('MY_DATASTORE', 'format', 'TEXT'); -- 关键配置:仅索引列值 end; /
- 删除旧索引并重新创建:
DROP INDEX SAMPLE_TABLE_IDX1; CREATE INDEX SAMPLE_TABLE_IDX1 ON SAMPLE_TABLE (EMP_NO) INDEXTYPE IS ctxsys.context PARAMETERS ('datastore MY_DATASTORE SYNC (ON COMMIT)');
验证结果
- 搜索
'%emp%'将返回0条记录; - 搜索
'%Do%'仍返回2条符合预期的记录; - 查看
DR$SAMPLE_TABLE_IDX1$I的TOKEN_TEXT,已无列名相关的token。
内容的提问来源于stack exchange,提问作者OracleERP123
相关产品推荐
相关产品推荐

