全文索引快的原因以及contains与like查找区别比较

1、中文分词器Chinese_vgram_lexer的属性mixed_case_ascii7可以用来设置是否要区分英文字母的大小写,默认是不区分大小写的,即你在查询中输入“T”还是“t”,都能查到字母t(T或是)。

疑问:wordlist里的属性设置,似乎不起作用,无论对英文中文分词器。如,在中文分词器,模糊查询英文字母,必须以“%AB%”形式,中文的则不加%,加了结果还不对,不知道什么意思?


2、全文索引用于模糊查询比一般的方法比如like用于模糊查询速度要快的原因是前者是用空间来换时间,在建立全文索引时主要通过分词器(lexer),将被索引的表上的那一列的所有值(即文本,要varchar等类型)分割成一个个token_text(比如,英文分词器BASIC_LEXER以空格,标点符号,_,-,等非字母数字的符号作为分割标记),而且记录这些token_text来自表里的哪些行等信息,最后将这些token_text和这些信息都写到表DR$索引名$I中。有了这张表,全文索引才可以快速地查找(无论是模糊还是不模糊查找),但是该表要占据空间的。

我们建立context类型的全文索引后,要对其索引的表进行查询时,查询语句里要使用contains运算符。

这里,说说contains运算符和like运算符在查找时有什么区别:

比如,我们查找“我们is中国人     而自豪”为例。

若context类型的全文索引选择使用Chinese_vgram_lexer中文分词器,则“我们is中国人     而自豪”这句话就会切分成以下几个token_text:

我们、们、is、中国、国人、人而、而自、自豪、豪。(Chinese_vgram_lexer中文分词器以标点符号、英文字母(空格不是)等为分句的标记,又将分句以两个字为单位进行分割,分句的最后一个字单独为一个token_text)

而like查询的话是没有将该句话分割的,还是将其整句话当作整体来看,所以select * from tab where contains(列名,’is‘)>0可以查到这句话(因为token_text里有is),而

select * from tab where  列名 like ’is‘查不到这句话(因为is 只是该句话的一部分,不是所有内容。若该句话整句话内容就就只有is,那就可以查到的)。

再看,select * from tab where contains(列名,’_s‘)>0也可以查到这句话,也因为token_text里有is,通过单字符通配符_就可以和is匹配上。

而select * from tab where  列名 like ’_s‘也还是查不到这句话,因为通过单字符通配符_不能和该整句话匹配上,is 只是该句话的一部分,不是所有内容。若该句话整句话内容就就只有is,那就可以查到的。

再看,select * from tab where contains(列名,’%is%‘)>0和select * from tab where  列名 like ’%is%‘都可以查到这句话,也因为通过多字符通配符%就可以和该整句话匹配上。

select * from tab where contains(列名,’%s%‘)>0和select * from tab where  列名 like ’%s%‘都可以查到这句话,也是同样的道理。


3、contains就是一个文本查询器程序,它带有自己的文本查询语法分析器。文本查询的语法规则:\是转义符,如在查询的文本里要想让_(下划线)不当做通配符就要转义,即\_;

{}也是转义符,如{a_b},包含其中的字符都成了文本字符。

4、

使用 CONTAINS 函数,发出基于内容的文档查询。例如:

SELECT id FROM docs WHERE CONTAINS (text, 'first') > 0;

这将在文本列包含单词 first (即文档1) 的 docs 中查找所有行。

语句中的>0部分是有效的Oracle SQL所必需的,Oracle SQL不支持函数的布尔返回值。

即>0表示条件为真

 


 

你可能感兴趣的:(全文索引)