全文索引快的原因以及contains与like查找区别比较
2016-07-30 23:28
399 查看
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表示条件为真
疑问: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表示条件为真
相关文章推荐
- 全文索引快的原因以及contains与like查找区别比较
- 全文索引:Sql的Contains语法
- 索引搜索与字符串查找的比较(Lucene学习笔记之一)
- 影响Lucene索引速度原因以及提高索引速度技巧
- 影响Lucene索引速度原因以及提高索引速度技巧
- SQL2005 全文索引 contains
- 全文索引——CONTAINS 语法 选择自 sxycgxj 的 Bl
- mysql 全文索引,回避like 的低效
- 影响Lucene索引速度原因以及提高索引速度技巧(收集)
- 影响Lucene索引速度原因以及提高索引速度技巧
- Oracle全文检索建索引,存储过程,以及java方法调用高亮显示
- 数据库文章:全文索引——CONTAINS 语法
- 全文索引——CONTAINS 语法
- 全文索引:Sql的Contains语法
- C#两个知识点的补充 string与stringbuilder的区别以及深层机制 C#中接口与抽象类的比较以及各自适用的场景
- 全文索引——CONTAINS 语法
- 全文检索的实现:Luene全文索引和数据库索引的比较
- 全文索引——CONTAINS 语法
- 影响Lucene索引速度原因以及提高索引速度技巧
- 求高行解决:SQL Server 2008中我建了全文索引速度比用like还慢