Oracle下对表建全文索引

1、对于中文,我们确定好全文索引的词法分析器,具体看一下这篇文章

http://blog.csdn.net/renfengjun/article/details/40266741


常用的中文词法分析器有

chinese_vgram_lexer和chinese_lexer


经过比较后我们决定使用chinese_lexer词法分析器,注意chinese_lexer只支持utf-8字符集


2、设置全文索引的设置偏好(preferences)。

使用“偏好”来指定索引信息,例如你的文件存储在哪里,你的文档如何过滤。创建“偏好”,并设置其属性。

oracle官网的提供的创建preference如下:https://docs.oracle.com/cd/E11882_01/text.112/e24436/cdatadic.htm#CCREF1919

    exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');    COMMIT;     //个人感觉这里是key,map先保存一个参数变量

然后在创建索引时使用这个preference:

       CREATE INDEX myindex on my_master(body) indextype is ctxsys.context
   parameters('lexer my_lexer');        COMMIT
其种myindex是要建的全文索引名称,master是表名,body是master表的字段(也就是要建索引的字段),下面那一句类似指定索引的上下文,加载我们前面设置词法分析器的preference

3、注意:

全文索引只能在类型:VARCHAR2, CLOB, BLOB, CHAR, BFILE, XMLType, and URIType上创建; 
不能在类型:NCLOB,NVARCHAR2,NCHAR,DATE,NUMBER,TIMESTAMP上创建;

所有语句都要用commit;  进行提交!!!


4、索引创建成功后,会在库中新建四个表,DR开头

http://yupengcc.iteye.com/blog/1265243

其中i表的数据在数据库进行DML操作时并不会自动同步进去,所以需要自行设置同步


5、使用索引查询时需要使用contains关键字,而不是like

select * from t_address where  CONTAINS(street,'某街道')>0;

(注:全文索引只能做到  like  '%string%'   而不能做到   like 'string%'的效果)


思考:既然索引不会自动伴随着DML操作去同步,那现在假设一个这样的场景:

设对A表的a列添加了全文索引,假设当前a的值只有‘一’,

当表里新增一条数据,a=‘二’时,我们此时select * from A where CONTAINS(a,'二')>0   会搜不到相应的记录。


因此索引要使用oracle的job去进行维护。


exec ctx_ddl.sync_index('IDX_TEST');--同步索引,将新的数据同步到索引

exec ctx_ddl.optimize_index('IDX_TEST','FULL');--优化索引,清除已删除的数据涉及到的索引


猜你喜欢

转载自blog.csdn.net/qq_16979575/article/details/78672559
今日推荐