可以使用intermedia(9i称之为Text)技术解决模糊查询的问题. 比如可以在"物资名称"字段上建立一个ctxsys.context的索引: create index idx_xxxx on kfwz(wzmc) indextype is ctxsys.context; 然后使用类似 select * from kfwz where contains(wzmc,'铁管'); 的语句进行查询,速度会很快。 不过这个东东不是一两句话能说清楚的,可以参考相关文档。
全文索引也是一种办法 也可以建立函数索引: create index index_name on tabname(instr(wzmc,'铁管'));
TO chanet(牧师) "建索引就行",这句话说的也太不负责任了! 建索引并不是提高查询速度的“万金油”,要看具体的SQL是否利用上了索引,就像这样的条件“物资名称 like '%铁管%'”,对“物资名称”建索引是无用的,除非像波波那样建函数索引,或者建立全文索引才能用到索引,从而提高查询速度。建索引就能够提高查询速度对初学者是个误导。
比如可以在"物资名称"字段上建立一个ctxsys.context的索引:
create index idx_xxxx on kfwz(wzmc) indextype is ctxsys.context;
然后使用类似
select * from kfwz where contains(wzmc,'铁管');
的语句进行查询,速度会很快。
不过这个东东不是一两句话能说清楚的,可以参考相关文档。
分析器(lexer),将文章中所有的表意单元(Oracle 称为 term)找出
来,记录在一组 以 dr$开头的表中,同时记下该term出现的位置、
次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的term,
并计算其出现频率,根据某个算法来计算每个文档的得分(score),
即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索
的效率。 Oracle 针对不同的语言提供了不同的 lexer, 而我们通常能用到其中
的三个:
basic_lexer: 针对英语。它能根据空格和标点来将英语单词从句子
中分离,还能自动将一些出现频率过高已经失去检索意义的单词
作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该
lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的
一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上
失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer
分析的结果只有一个term ,就是‘中国人民站起来了’。此时若
检索‘中国’,将检索不到内容。 chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集。该
分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,
会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,
‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析
方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。 chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。上面
已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词
汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语
中根本不会单独出现,因此这种term是没有意义的,反而影响效率。
chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,
因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大
提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则
只能使用笨笨的那个Chinese vgram lexer. ...
也可以建立函数索引:
create index index_name on tabname(instr(wzmc,'铁管'));
建索引并不是提高查询速度的“万金油”,要看具体的SQL是否利用上了索引,就像这样的条件“物资名称 like '%铁管%'”,对“物资名称”建索引是无用的,除非像波波那样建函数索引,或者建立全文索引才能用到索引,从而提高查询速度。建索引就能够提高查询速度对初学者是个误导。