热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle全文索引之停用词的通配符功能

全文索引停用词的设置在前面的文章中已经介绍过了,这里简单说明记录一下停用词在查询时候需要注意的地方。[more]Oracle10g中,如果安装语言为中文
全文索引停用词的设置在前面的文章中已经介绍过了,这里简单说明记录一下停用词在查询时候需要注意的地方。[@more@]Oracle10g中,如果安装语言为中文,默认的LEXER为CHINESE_VGRAM_LEXER,默认的停用词语言也为中文。这篇通过对比中文环境和英文环境来说明停用词查询的一些特点。

SQL> show user
USER is "MYUSER"
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

Table created.

SQL> INSERT INTO T VALUES (1, 'This example test stopword.');

1 row created.

SQL> INSERT INTO T VALUES (2, 'Oracle9i chinese language environment default stopword are english.');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT;

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'This') > 0;

no rows selected


英文环境下允许单独查询停用词,但是不会返回结果。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'are english') > 0;

ID DOCS
--- --------------------------------------------------
2 Oracle9i chinese language environment default stop
word are english.


SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'is english') > 0;

ID DOCS
--- --------------------------------------------------
2 Oracle9i chinese language environment default stop
word are english.


SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'stopword are english') > 0;

ID DOCS
--- --------------------------------------------------
2 Oracle9i chinese language environment default stop
word are english.


SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'stopword is english') > 0;

ID DOCS
--- --------------------------------------------------
2 Oracle9i chinese language environment default stop
word are english.


SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'are stopword') > 0;

ID DOCS
--- --------------------------------------------------
1 This example test stopword.
2 Oracle9i chinese language environment default stop
word are english.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'are example') > 0;

ID DOCS
--- --------------------------------------------------
1 This example test stopword.


上面这些查询,由于are、is都是停用词,因此可以认为是一个替代符,代替任何单词。而且查询语句中包含的停用词不仅可以替代文档中本身的停用词,还可以替代任何有意义的单词,如上面对ARE STOPWORD的查询分别对应了DEFAULT STOPWORD和TEST STOPWORD



SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'stopword english') > 0;

no rows selected

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'default is stopword') > 0;

no rows selected

最后两个查询说明停用词虽然可以替换任何词,但是无论是文档中的停用词还是查询语句中包含的停用词,对必须对应一个单词,如果直接将停用词所在位置的单词忽略掉是不会返回结果的。仅这一点上,停用词有点像通配符“_”。

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production


下面是中文环境的测试

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

表已创建。

SQL> INSERT INTO T VALUES (1, '这个例子测试停用词');

已创建 1 行。

SQL> INSERT INTO T VALUES (2, 'Oracle10g中文环境默认也是中文');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT;

索引已创建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '这个') > 0;
SELECT * FROM T WHERE CONTAINS(DOCS, '这个') > 0
*第 1 行出现错误:
ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
ORA-20000: Oracle Text error:
DRG-10817: CONTAINS 搜索词包含禁用词或禁用词的词组: 这个对于中文环境,如果查询只包含停用词,那么查询会报错,这一点和英文环境明显不同。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '也是中文') > 0;

ID DOCS
---------- --------------------------------------------------
2 Oracle10g中文环境默认也是中文

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '就是中文') > 0;

ID DOCS
---------- --------------------------------------------------
2 Oracle10g中文环境默认也是中文

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '还是中文') > 0;

ID DOCS
---------- --------------------------------------------------
2 Oracle10g中文环境默认也是中文

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '不是中文') > 0;

未选定行

由于“也是”、“就是”和“还是”都是停用词,索引查询2到查询4都可以返回结果。但是“不是”不属于停用词,因此,通过不是查询无法返回结果。这个测试和英文停用词的测试很像。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '默认也是中文') > 0;

ID DOCS
---------- --------------------------------------------------
2 Oracle10g中文环境默认也是中文

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '默认就是中文') > 0;

未选定行

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '默认还是中文') > 0;

未选定行

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '默认不是中文') > 0;

未选定行

这次在查询语句中,停用词两边都包含了内容,这时候发现停用词似乎没有起作用,只有全文匹配的查询生效了。感觉是由于中文的切词要比英文复杂,因此不好判断查询短语中是否包含了停用词。


SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '环境默认') > 0;

ID DOCS
---------- ----------------------------------------------------------
2 Oracle10g中文环境默认也是中文

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '也是默认') > 0;

未选定行

两个查询也说明了中文和英文环境的不同。中文环境中,查询语句中的停用词似乎只能替换停用词,而不能再替换其他有意义的词汇了。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '默认中文') > 0;

未选定行


最后一个查询和英文环境一致,停用词必须占一个词的位置。

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/271283/viewspace-1022568/,如需转载,请注明出处,否则将追究法律责任。

转:http://blog.itpub.net/271283/viewspace-1022568/



推荐阅读
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
黄宗翰琼琦莉雯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有