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');--优化索引,清除已删除的数据涉及到的索引