TA的每日心情 | 开心 23 小时前 |
---|
签到天数: 41 天 [LV.5]常住居民I
超级版主
 
- 积分
- 306472
|
具体理解
O现全文检索,其机制其很简单。即通过O专利的词法分析器(),将文章中所有的表意单元(O称为,此处我理解为单词或者一些有意义的词语)找出来,记录在一组以$开头的表中,同时记下该出现的位置、次数、值等信息。检索时,O从这组表中查找相应的,并计算其出现频率,根据某个算法来计算每个文档的得分(),即所谓的‘匹配率’。而则是该机制的核心,它决定了全文检索的效率。O针对不同的语言提供了不同的,而我们通常能用到其中的个:
_:针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如,等,具有较高的处理效率。但该应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个,事上失去检索能力。以‘人民站起来了’这句话为例,_分析的结果只有一个,就是‘人民站起来了’。此时若检索‘’,将检索不到内容。
__:专门的汉语分析器,支持所有汉字字符集。该分析器按字为单元来分析汉语句子。‘人民站起来了’这句话,会被它分析成如下几个:‘中’,‘’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,现算法很简单,并且能现‘一打尽’,但效率则是差强人意。
_:这是一个新的汉语分析器,只支持8字符集。上面已经看到,这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种是没有意义的,反而影响效率。_的比较大改进就是该分析器能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大提高了效率。但是它只支持8,如果你的数据库是16字符集,则只能使用笨笨的那个C。
--以上的说法是针对于O8或者是更低级版本的,在O92中采用C_分析器测试是没有这个问题的。
如果不做任何设置,O缺省使用_这个分析器。要指定使用哪一个,可以这样操作:
首,在用户下建立一个:
__('','CHINESE_LEXER');
第二,在建立索引时,指明所用的:
__()
(
'DATASTORECTXSYSDIRECT_DATASTOREFILTER
CTXSYSNULL_FILTERLEXERWORDLIST')
这样建立的全文检索索引,就会使用CHINESE_LEXER作为分析器。
使用定时同步和化
在索引建好后,如果表中的数据发生变化,比如增加或修改了记录,怎么办由于对表所发生的任何语句,都不会自动修改索引,因此,必须定时同步()和化()索引,以正确反映数据的变化。
在索引建好后,我们可以在该用户下查到O自动产生了以下几个表:(假设索引为):
DR$$I,DR$$K,DR$$R,DR$$N
其中以I表比较重要,可以查询一下该表,看看有什么内容:
_,_DR$I_RSK1$I=20;
可以看到,该表中保存的其就是O分析你的文档后,生成的记录在这里,包括出现的位置、次数、值等。当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证O在做全文检索时正确检索到内容(因为所谓全文检索,其核心就是查询这个表)。那么如何维护该表的内容呢总不能每次数据改变都重新建立索引吧!这就用到和了。
同步():将新的保存到I表。
化():清除I表的垃圾,主要是将已经被删除的从I表删除。
检查全文索引是否创建成功
1、检查DR$$I是否存在,其中的代表建立的索引称;
2、检查全文索引是否创建成功,比较好采用C来检查,具体的语法为
C(CN,SK)0CN为所需要检查的列,也即创建了全文索引的列
SK为你需要查找的内容,为字符型
列如,按上面创建的全文索引,可以使用如下的语句:
S*FPERSONINFOWC(PERSONDESC,'',1)0
S*FPERSONINFOWC(PERSONDESC,'',1)0
如果你创建的全文索引不成功,则返回失败,其内容为:
ORA-20000:OT RG-10599:列没有编制索引
当然,如果你创建成功,则会正确返回数据。还有一个检查全文索引是否创建成功的方法是感觉创建全文索引后的查询速度。
测试数据
下面是对一个表进行操作时,在同一台机器中获得的测试数据。
PI表有182263条记录,其中不为的记录数为180187条记录,
其中,包括“大学”两个汉字的记录数为21579条记录
包括“1999”两个汉字的记录数为10889条记录
测试一、直接用来查询中文“大学”
SQL:S(*)FW'%大学%'
时间开销:耗时40秒688毫秒
测试二、直接用来查询英文“1999”
SQL:S(*)FW'%1999%'
时间开销:耗时47秒218毫秒
测试、未创建全文索引时,直接用_来查询中文“大学”
SQL:S(*)FW_(,'大学',1,1)0
时间开销:耗时47秒031毫秒
测试四、未创建全文索引时,直接用_来查询英文“1999”
SQL:S(*)FW_(,'1999',1,1)0
时间开销:耗时44秒360毫秒
测试五、未创建全文索引时,直接用C来查询中文“大学”
SQL:S(*)FWC(,'大学',1)0";
执行失败:ORA-20000:OT RG-10599:列没有编制索引
测试六、未创建全文索引时,直接用C来查询英文“1999”
SQL:S(*)FWC(,'1999',1)0";
执行失败:ORA-20000:OT RG-10599:列没有编制索引
测试七、采用CHINESE_LEXER词法分析器创建全文索引后,直接用C来查询英文“1999”
SQL:S(*)FWC(,'1999',1)0";
时间开销:首次查询耗时469毫秒,后面的多次查询耗时210毫秒左右
***查询出来的记录数比在未建立索引时用、_方式查询出来的记录数要少一些
测试八、采用CHINESE_LEXER词法分析器创建全文索引后,直接用C来查询中文“大学”
SQL:S(*)FWC(,'大学',1)0";
时间开销:首次查询耗时9秒359毫秒,后面的多次查询耗时210毫秒左右
***查询出来的记录数比在未建立索引时用、_方式查询出来的记录数要少一些
测试九、采用CHINESE_LEXER词法分析器创建全文索引后,用_来查询中文“大学”
SQL:S(*)FW_(,'大学',1,1)0
时间开销:耗时54秒953毫秒
测试十、采用CHINESE_LEXER词法分析器创建全文索引后,直接用_来查询英文“1999”
SQL:S(*)FW_(,'1999',1,1)0
时间开销:耗时52秒652毫秒
总体感觉O的中文全文索引不是很好。后续版本或许会有所改进吧。 |
|