如何更好的利用Oracle全文检索
oracle数据库的使用方法
oracle数据库的使用方法以下是使用Oracle数据库的常见方法:1. 安装Oracle数据库:首先要安装Oracle数据库软件。
可以从Oracle官方网站下载安装程序,然后按照安装向导进行安装。
2. 创建数据库:安装完成后,可以使用Oracle提供的工具(如SQL*Plus、SQL Developer等)登录到数据库,然后使用DDL语句(如CREATE DATABASE)创建数据库。
3. 创建表:在数据库中创建表格是存储数据的基本单位。
可以使用CREATE TABLE语句来创建表,指定表的名称、列名和列的数据类型等。
4. 插入数据:可以使用INSERT语句将数据插入到表中。
语法类似于INSERT INTOtable_name (column1, column2, ...) VALUES (value1, value2, ...)。
5. 查询数据:可以使用SELECT语句从表中查询数据。
语法类似于SELECT column1,column2, ... FROM table_name WHERE condition。
可以使用WHERE子句来添加查询条件。
6. 更新数据:可以使用UPDATE语句更新表中的数据。
语法类似于UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition。
可以使用WHERE子句来指定更新的行。
7. 删除数据:可以使用DELETE语句从表中删除数据。
语法类似于DELETE FROMtable_name WHERE condition。
可以使用WHERE子句来指定要删除的行。
8. 索引和约束:可以使用索引来提高查询性能,可以使用约束来保证数据的完整性和一致性。
可以使用CREATE INDEX语句创建索引,使用ALTER TABLE语句添加约束。
9. 事务管理:Oracle支持事务的概念,可以使用BEGIN TRANSACTION、COMMIT和ROLLBACK语句来管理事务。
使用Oracle全文索引搜索文本
使用Oracle全文索引搜索文本不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR 函数和LIKE操作符实现。
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0;SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限,因此对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能建立全文检索的步骤步骤一检查和设置数据库角色首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。
如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。
你必须修改数据库以安装这项功能。
默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys 的用户。
步骤二赋权在ctxsys用户下把ctx_ddl的执行权限赋于要使用全文索引的用户,例:grant execute on ctx_ddl to pomoho;步骤三设置词法分析器(lexer)Oracle实现全文检索,其机制其实很简单。
即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为term)找出来,记录在一组以dr$开头的表中,同时记下该term 出现的位置、次数、hash 值等信息。
检索时,Oracle 从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。
而lexer则是该机制的核心,它决定了全文检索的效率。
Oracle 针对不同的语言提供了不同的lexer, 而我们通常能用到其中的三个:n basic_lexer: 针对英语。
oracle对表选择索引的扫描方法
Oracle在执行查询时,会根据查询条件选择合适的索引来进行扫描。
它使用以下几种
方法来选择索引扫描方式:
1. 全表扫描(Full Table Scan):当没有适用的索引或者优化器认为全表扫描更高效时,Oracle会选择对整个表进行扫描。
这通常在小表或者需要扫描大部分数据的情况下发生。
2. 索引扫描(Index Scan):如果有适用的索引,Oracle可以使用索引扫描来避免全表
扫描。
索引扫描可以是范围扫描(Range Scan)、唯一索引扫描(Unique Scan)、位
图索引扫描(Bitmap Index Scan)等。
3. 聚簇索引扫描(Clustered Index Scan):当表使用聚簇索引时,Oracle可以通过聚簇
索引扫描来获取数据。
聚簇索引将相邻行的数据存储在一起,因此可以减少磁盘I/O
操作。
4. 索引唯一扫描(Index Unique Scan):当查询条件中包含唯一索引的完整键值时,Oracle可以使用索引唯一扫描来获取数据。
这种扫描方式只返回满足条件的一行数据。
5. 索引范围扫描(Index Range Scan):当查询条件中包含索引的部分键值时,Oracle
可以使用索引范围扫描来获取数据。
这种扫描方式返回满足条件的多行数据。
以上是Oracle选择索引扫描方法的一些常见方式,实际选择会受到许多因素的影响,
如索引的选择性、表的大小、查询条件的复杂度等。
优化器会根据统计信息和成本评
估来选择最佳的索引扫描方式。
全文检索方案
-检索服务模块:提供用户查询请求处理和结果返回。
-用户界面模块:提供用户与系统交互的友好界面。
2.技术选型
-搜索引擎:选用成熟稳定的开源搜索引擎技术。
-分词组件:采用高效准确的中文分词技术。
-数据存储:基于分布式文件系统,确保数据的高可用性。
-安全机制:采用加密和安全认证技术保障数据安全。
3.试点推广:在部分部门或业务领域进行试点应用,根据反馈调整优化系统。
4.全员推广:逐步将全文检索系统推广至全公司,提高整体工作效率。
六、总结
全文检索方案旨在为企业提供高效、准确的检索服务,助力企业快速从海量数据中获取有价值的信息。本方案遵循合法合规原则,注重用户隐私保护和数据安全,具备较强的实用性和可推广性。希望通过本方案的实施,为企业带来良好的效益。
2.用户隐私保护
在数据采集、存储、检索等过程中,采取匿名化、加密等手段,保护用户隐私信息。
3.数据安全
建立完善的数据安全防护策略,包括数据备份、访问控制、安全审计等措施,防止数据泄露和非法访问。
五、实施与部署
1.技术培训
对系统管理员和最终用户进行专业的技术培训,确保他们能够熟练使用和运维全文检索系统。
3.功能设计
-基础检索:支持关键词、短语、句子等多种检索方式。
-高级检索:提供分类、标签、日期等筛选条件。
-检索优化:实现智能提示、拼写纠错、同义词扩展等功能。
-结果展示:提供分页、排序、高亮显示等用户友好的展示方式。
四、合法合规性保障
1.法律法规遵循
本方案严格遵循《网络安全法》、《数据安全法》等法律法规,确保系统设计和实施符合国家要求。
2.系统部署
基于Oracle Text的信息系统资料库全文检索技术
( )过滤 器 提取 文 档 数 据 并 将其 转换 为文 本 表 示 方 式 。存 储 二进 制 文 档 ( wod 2 如 r
或 ar b t co a 文件 )时需 要 这样 做 。过滤器的输 出不 必是 纯 文本 格 式 , 可 以是 x 或 h — 它 ml t
ml 之类 的文 本 格式 。
O al Te t rce x 的原 理及 其 在信 息 系统 中的使 用 。
关 键词 : a l Te t 资料库 ; 文检 索 0rce x ; 全
1 引 言
OrceT x 是 Orce al e t a l 提供 的一 个服务 集 , 功能 十分 强大 , 可 以 为文 档 提 供索 引 方 它 法 、 行检 索 , 可 以对 文 档进 行格式 转换 、 进 还 存储 和 管理等 。它 不仅 支 持 TXT、 HTML等 纯文 本格 式 , 支持 很 多种 二进 制格 式的 文档 , D C、 P P F等等 。OrceTe t 还 如 O P T、 D al x 还 可用来 对 不 同语 种 的 文档进 行 检索 。Orc x 是完 全集 成在 数据 库 核心 内的 , 对 数 a l Te t e 它 据 库 中的 文档 进 行检 索 的效 率很 高 。
( )分段 器 提取 过 滤器 的输 出信息 , 3 并将 其转 换为 纯文 本 。包 括 x 和 h ml 内的 ml t 在
不 同 文本 格式 有 不 同的分 段器 。转换 为纯 文本 涉 及检 测 重要 文档 段标 记 、 移去 不 可 见 的 信 息 和文本 重新 格式化 。
( )词 法 分析 器提 取 分段器 中的纯 文本 , 将 其拆 分 为不 连 续 的标 记 。既 存在 空 白 4 并 字 符 分 隔语 言使 用 的词 法分 析器 , 也存在分 段复 杂的亚 洲语 言使用 的专 门词法 分析器 。 ( )索 引引 擎提 取词 法分 析器 中的所 有标 记 、 档 段在 分段 器 中的偏 移 量 以及 被 称 5 文 为 非索 引字 的 低 信息含 量字 列表 , 并构 建反 向索 引 。倒排 索 引 存 储标 记和 含有 这 些 标 记
全文检索方案
1 全文检索系统方案1.1 全文检索系统总体方案系统将采用以下全文检索流程。
针对企业内部的信息,包括文件服务器上的文件、网站网页、ERP 等系统存放信息的数据库信息、办公应用中的公文档案文档已经内容管理系统中流转的内容,本系统提供了两种数据适配器来提取其中的正文内容和属性内容,形成一个相对结构化的数据虚拟层;本系统的索引引擎(Indexer )对结构化的数据虚拟层进行中文切分词、文件特征分析和逐步索引,以及其它索引算法,生成索引数据库;使用者(user )在搜索页面中输入查询字串等搜索条件并提交给本系统后,本系统的全文检索查询引擎(Searcher )会在索引库中进行搜索,并将符合搜索条件的搜索结果返回给使用者;使用者(user )可于查询结果页面,进一步链接到信息原文查看详细内容。
对于系统管理,管理员可通过相应web 方式的管理程序来管理整个系统运行环境及设置文件;并通过索引引擎(Indexer.exe )实时或定时创建索引,更新索引数据库的内容,使检索信息维持在最新状态。
IRMS.Indexer Index DatabaseIRMS.SearchEngine(User Interface)Application (User Interface)ApplicationTerm Extract Term Index Folder/Share Folder with DocumentsWeb Site Robot/Spider By URL EntryRDBMS(ODBC /OLEDB / JDBC)Lotus Domino R5,R6(NSF)FileNET內容管理Fuzzy SearchSynonym PhraseWild-CardMulti-field Filter IRMS AdapterData Source ComposerFile Extractor1.2 全文检索系统平台架构本系统基于组件化和松散耦合架构和设计,系统平台架构示意图如下:整个系统主要分为信息整合、信息萃取和服务、应用整合三个部分。
详解Oracle数据库中文全文索引
详解Oracle数据库中文全文索引Oracle数据库的全文检索技术已经非常完美,Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力。
Oracle Text是Oracle9i采用的新名称,在Oracle8/8i中它被称作Oracle interMedia Text,在Oracle8以前它的名称是Oracle ConText Cartridge。
二、Oracle Text 索引文档时所使用的主要逻辑步骤如下:(1) 数据存储逻辑搜索表的所有行,并读取列中的数据。
通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。
(2) 过滤器提取文档数据并将其转换为文本表示方式。
存储二进制文档(如Word 或Acrobat 文件) 时需要这样做。
过滤器的输出不必是纯文本格式-- 它可以是XML 或HTML 之类的文本格式。
(3) 分段器提取过滤器的输出信息,并将其转换为纯文本。
包括XML 和HTML 在内的不同文本格式有不同的分段器。
转换为纯文本涉及检测重要文档段标记、移去不可见的信息和文本重新格式化。
(4) 词法分析器提取分段器中的纯文本,并将其拆分为不连续的标记。
既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。
(5) 索引引擎提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。
倒排索引存储标记和含有这些标记的文档。
三、需要的权限要使用Oracle Text,必须具有CTXAPP角色或者是CTXSYS用户。
Oracle Text为系统管理员提供CTXSYS用户,为应用程序开发人员提供CTXAPP角色。
具有CTXAPP角色的用户可执行以下任务:创建索引,管理Oracle Text 数据字典,包括创建和删除首选项,进行Oracle Text 查询,使用Oracle Text PL/SQL程序包。
oracle 全文索引 处理字母
oracle 全文索引处理字母English Answer:Oracle Full-Text Indexing for Alphabetical Characters.Oracle Full-Text Indexing is a powerful feature that allows users to search for words and phrases within text columns. It can be used to improve the performance of queries that search for specific terms, and it can also be used to create powerful search applications.Oracle Full-Text Indexing supports a variety of languages, including English, Chinese, Japanese, and Korean. When indexing text in a language that uses an alphabet, Oracle Full-Text Indexing will automatically break the text into individual words. This process is known as tokenization.The tokenization process is language-specific. For example, when indexing English text, Oracle Full-TextIndexing will break the text into individual words by spaces. When indexing Chinese text, Oracle Full-Text Indexing will break the text into individual words by characters.Once the text has been tokenized, Oracle Full-Text Indexing will create an index of the words. This index is used to speed up the process of searching for specific terms.When a user searches for a term, Oracle Full-Text Indexing will use the index to find all of the documents that contain that term. The results of the search will be ranked according to the relevance of the documents to the search term.Oracle Full-Text Indexing is a powerful tool that can be used to improve the performance of queries that search for specific terms. It can also be used to create powerful search applications.中文回答:Oracle 全文索引处理字母。
基于Oracle的全文检索技术
似通过词典中的检索子表查词 的过程 。
一
个全 文 检 索 系 统 至 少 需 要 具 备 建 立 索 引 和 提 供 检 索
这两项基本 功能。索 引关 注点是在数据存储 的空 间性 上 , 一 个优秀的索引在 数据存储 空间性上应尽可能小 ; 而检索的关
4稿 H期 :0 9 1 I ( 20 — 2—3 1
O alTet rc x 的核心技术 是通过 其词 法分 析器将 文档 中 e 有实际意义的词 找出来 , 录这些词 出现 的文 档编 号 、 记 出现
13 搜 索引擎排序 技术 通过 检索模 型得 到的检 索结 .
果有千万 , 但是真正能够满足用户需求 的信息 只是其 中很小 的一部分 , 如何将得到 的结果进行排 序 , 和查询 关键 词最 将 相关的信息放在前面 , 是检紊 陛能的重 要标 志 。排序技 术包 括正排索引和倒排索引。正排索引是指扫描 出现 的文档 , 对 文档 中出现 的词的词频和位置进行索引 , 查询时依次对 文档 进行搜索 , 由于正排索 引的响应速 度 比较慢 , 在多用 倒排 现 索引 。倒排索引是指 扫描 出现 的每一个词 , 出现 的词语 都 对 会有一个它出现过 的文档列 表 , 它包 含 了出 现的文 档编 号,
l 全 文检 索技 术
全 文 检 索 即 全文 搜 索 , 指 以索 引 系 统 文 本 中 出 现 的 字 是
符串构建索 引, 指明该字 符串在文本 中出现 的次 数和位 置。
当用户进行查询 时 , 检索系统就会根据事先建立 的索引进行
查 找 , 将 查 找 的 结 果 反 馈 给 用 户 的 检 索 方 式 。 这个 过 程 类 并
数据库检索的技巧
数据库检索的技巧数据库检索是指通过特定的查询语言(如SQL)来获取需要的数据。
在进行数据库检索时,可以使用一些技巧来提高检索效率和准确性。
以下是一些常用的数据库检索技巧。
1. 确定检索需求:在开始检索之前,要明确自己需要获取哪些数据。
需求明确可以帮助我们更好地组织查询语句,提高检索效率。
2. 使用索引:数据库索引是一种提高数据查询速度的技术。
在查询过程中,数据库会先在索引中搜索,然后再定位到具体的数据行。
因此,合理地使用索引可以大大提高数据检索的效率。
常见的索引包括主键索引、唯一索引和普通索引。
3. 编写高效的查询语句:在编写查询语句时,要注意语句的简洁和高效。
可以合理地选择查询的字段,只选择需要的字段,避免选择全部字段。
此外,合理地使用JOIN操作,可以将多个表中的相关数据连接起来,提高查询效率。
4. 使用WHERE子句:WHERE子句可以帮助我们根据指定的条件筛选出满足要求的数据。
在使用WHERE子句时,要注意使用索引列作为查询条件,这样可以更快地获取结果。
5. 使用分页查询:当数据库中数据量很大时,一次性获取全部数据可能会导致性能问题。
可以使用分页查询的方式,按需获取数据。
分页查询可以使用LIMIT关键字或者使用ROW_NUMBER()函数来实现。
6. 使用ORDER BY子句:ORDER BY子句可以对查询结果进行排序。
在使用ORDER BY子句时,可以选择合适的排序字段,并根据需要进行升序或降序排序。
注意,当对大量数据进行排序时,可能会影响性能。
7. 使用GROUP BY子句:GROUP BY子句可以将数据按照指定的字段进行分组,并对每个分组进行聚合操作,如COUNT、SUM等。
GROUP BY子句常与聚合函数一起使用,可以快速得到需要的结果。
8. 使用子查询:子查询可以将一个查询语句嵌套在另一个查询语句中。
子查询可以用来获取嵌套条件的数据,或者用来作为大查询的过滤条件。
在使用子查询时,要注意查询语句的逻辑和性能。
检索数据库和方法
检索数据库和方法
1. 关键字检索:这是最常见的检索方法,用户通过输入与所需信息相关的关键字来查找匹配的记录。
数据库将返回包含这些关键字的所有记录。
2. 高级检索:高级检索允许用户使用更多的条件和运算符来更精确地定义他们的检索需求。
用户可以使用逻辑运算符(如 AND、OR、NOT)以及通配符来组合多个关键字,并指定字段、日期范围等条件。
3. 全文检索:全文检索是一种基于文本内容的检索方法,它可以搜索数据库中所有文本字段的内容。
它不仅可以匹配确切的关键字,还可以匹配关键词的近义词、相关词等。
4. 分类检索:某些数据库可能按照特定的分类体系进行组织,用户可以通过选择特定的分类来检索相关的记录。
5. 字段检索:用户可以选择特定的字段进行检索,例如作者、标题、摘要、日期等。
这种方法可以帮助用户更准确地找到他们所需的信息。
6. 布尔检索:布尔检索是一种使用逻辑运算符来组合检索条件的方法。
例如,用户可以使用"AND"操作符来查找同时包含两个关键字的记录,使用"OR"操作符来查找包含任何一个关键字的记录。
这些是一些常见的数据库检索方法,具体的检索方式可能因所使用的数据库系统而有所不同。
在进行数据库检索时,建议先了解所使用的数据库的检索功能和语法,以便有效地找到所需的信息。
oracle索引及使用原则
oracle索引及使用原则一、索引类型B-tree indexes 平衡二叉树,缺省的索引类型B-tree cluster indexes cluster的索引类型Hash cluster indexes cluster的hash索引类型Global and local indexes 与patitioned table相关的索引Reverse key indexes Oracle Real Application Cluster使用Bitmap indexes 位图索引,索相列的值属于一个很小的范围Function-based indexes 基于函数的索引Domain indexes二、使用索引的原则尽量在插入数据完成后建立索引,因为索引将导致插入数据变慢,特别是唯一索引在正确的表和列上建索引优化索引列顺序提高性能限制每个表的索引个数删除不需要的索引指定索引的block设置估计索引的大小设置存储参数指定索引使用的表空间建索引时使用并行使用nologing建立索引二,各种索引使用场合及建议(1)B*Tree索引。
常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。
Create index indexname on tablename(columnname[columnname...])(2)反向索引。
B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。
Create index indexname on tablename(columnname[columnname...]) reverse(3)降序索引。
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
Create index indexname on tablename(columnname DESC[columnname...])(4)位图索引。
oracle索引。其中全文检索最变态
oracle索引。
其中全⽂检索最变态全⽂检索位图索引B全⽂检索很少使⽤,如果产品上使⽤⼤家可以⽤Lcunce这些应⽤如果⾮要在数据库做这个采⽤就把⽤⼀个全⽂检索索引检索索引不会像其他的索引创建⼀个对象他会创建⼗个相关的对象。
⼗张的其中⼀张表存在形式如下Dtaken_text token_last tokent_count是 1 1是⼀个 1 1我是 1 1我是⼀个 1 1通过形式就猜到冗余存储如果表数据10M 索引表估计要50m⼤家会想问like 会⽤全⽂索引实际是不会的下⾯⽅法使⽤select * form t where contains("name","DBA")>0我插⼊⼀条sql 会直接有索引吗答案可能你猜错了没有的需要⼿⼯同步alter index t_idx_rebuild parameters('sync');⼿⼯同步有时间也是优势,以后讲sql优化⽅案会讲到的。
删除更新同样需要公共同步当然oracle 可以⾃动同步,只是默认没有开启。
全⽂索引操作量太⼤。
位图索引在⼤量相同数据时B树索引是⾮常低效的。
位图索引存款空间⼩对 or⽐较⾼效。
位图索引适合数据仓库不适合 oltp位图索引⽤在下⾯情况1.重复率⾼的数据2.特定类型的查询。
对 or⽐较⾼效。
3.联合索引B树索引唯⼀索引和主键的区别。
主键侧重的外键,唯⼀索引强调索引。
采⽤数据结构B树索引。
⼤量插⼊压⼒很⼤。
Hive索引的弊端:– 每次查询时候都要先⽤⼀个job扫描索引表,如果索引列的值⾮常稀疏,那么索引表本⾝也会⾮常⼤– 索引表不会⾃动rebuild,如果表有数据新增或删除,那么必须⼿动rebuild索引表数据索引是传统RDBMS的标准技术,⽤来加速查询Hive⾃0.7版本开始⽀持索引,但提供的功能很有限,效率也并不⾼,因此Hive索引很少使⽤Hive索引原理:– 在指定列上建⽴索引,⽣成⼀张索引表(Hive的⼀张物理表),记录以下三个字段:索引列的值、该值对应的HDFS⽂件路径、该值在⽂件中的偏移量– 在执⾏索引字段查询时候,⾸先额外⽣成⼀个MapReduce job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs⽂件路径及偏移量,输出到hdfs上的⼀个⽂件中,然后根据这些⽂件中的hdfs路径和偏移量,筛选原始input⽂件,⽣成新的split,作为整个job的split,达到不⽤全表扫描的⽬的。
oracle all用法
Oracle ALL用法1. 概述在Oracle数据库中,ALL是一个关键字,可用于查询和过滤数据。
它可以与其他SQL语句一起使用,如SELECT、UPDATE和DELETE等。
使用ALL关键字可以对表中的所有行或特定条件下的所有行进行操作。
2. SELECT语句中的ALL用法2.1 查询所有行要查询表中的所有行,可以使用以下语法:SELECT * FROM table_name;这将返回指定表中的所有行。
2.2 查询满足特定条件的所有行要查询满足特定条件的所有行,可以使用以下语法:SELECT * FROM table_name WHERE condition;其中,condition是用于筛选数据的条件表达式。
例如,要查询年龄大于30岁的员工信息:SELECT * FROM employees WHERE age > 30;这将返回年龄大于30岁的员工信息。
2.3 使用ALL关键字进行比较在某些情况下,我们可能需要对结果集进行比较。
此时,可以使用ALL关键字来执行比较操作。
2.3.1 大于ALL子查询结果要查询大于某个子查询结果集中所有值的行,可以使用以下语法:SELECT column_name FROM table_name WHERE column_name > ALL (subquery);例如,要查询工资高于所有员工的经理信息:SELECT * FROM managers WHERE salary > ALL (SELECT salary FROM employees);这将返回工资高于所有员工的经理信息。
2.3.2 小于ALL子查询结果要查询小于某个子查询结果集中所有值的行,可以使用以下语法:SELECT column_name FROM table_name WHERE column_name < ALL (subquery);例如,要查询工资低于所有员工的经理信息:SELECT * FROM managers WHERE salary < ALL (SELECT salary FROM employees);这将返回工资低于所有员工的经理信息。
oracle全文检索
全文检索(oracle text)Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力,Oracle Text是Oracle9i采用的新名称,在oracle8/8i中被称为oracle intermedia text,oracle8以前是oracle context cartridge。
Oracle Text的索引和查找功能并不局限于存储在数据库中的数据。
它可以对存储于文件系统中的文档进行检索和查找,并可检索超过150种文档类型,包括Microsoft Word、PDF和XML。
Oracle Text查找功能包括模糊查找、词干查找(搜索mice 和查找mouse)、通配符、相近性等查找方式,以及结果分级和关键词突出显示等。
你甚至可以增加一个词典,以查找搭配词,并找出包含该搭配词的文档。
Oracle text 需要为可检索的数据项建立索引,用户才能够通过搜索查找内容,索引进程是根据管道建模的,在这个管道中,数据经过一系列的转换后,将其关键字会添加到索引中。
该索引进程分为多个阶段,如下图1.数据检索(Datastore):只是将数据从数据存储(例如web页面、数据库大型对象或本地文件系统)中取出,然后作为数据流传送到下一个阶段。
2. 过滤(Filter):过滤器负责将各种文件格式的数据转换为纯文本格式,索引管道中的其他组件只能处理纯文本数据,不能识别 Ms word 或 excel 等文件格式。
3. 分段(Sectioner):分段器添加关于原始数据项结构的元数据。
4. 词法分析(Lexer):根据数据项的语言将字符流分为几个字词。
5. 索引(Index):最后一个阶段将关键字添加到实际索引中。
测试环境:Linux AS release 4 (Nahant Update 3), oracle10g(10.2.0.2.0)内容简介:本文档主要以实验为主,文档中包含了大量的实验例子,部分测试用例来自document,部分来自网友的测试,所有的例子都在oracle10g中测试通过。
oracle全文检索示例语句
"TITLE" VARCHAR2(400) NOT NULL ENABLE,
"BOOK_ABSTRACT" VARCHAR2(2000) NOT NULL ENABLE,
"PATH" VARCHAR2(200) NOT NULL ENABLE
)TABLESPACE "FORCEVIEW";
BEGIN
ctx_ddl.optimize_index('forceview.idx_aritcle_content','FULL');
END;
call forceview.cont_sync_index();
call forceview.cont_optimize_index();
INSERT INTO forceview.ctx_content VALUES ห้องสมุดไป่ตู้4,'the four doc');
INSERT INTO forceview.ctx_content VALUES (5,'the five doc');
INSERT INTO forceview.ctx_content VALUES (6,'the six doc');
('DATASTORE mymds FILTER CTXSYS.INSO_FILTER LEXER forceview.main_lexer WORDLIST forceview.mywordlist');
--索引同步存储过程
CREATE or replace procedure forceview.cont_sync_index as
Oracle数据库查询优化方案(处理上百万级记录如何提高处理查询速度)
Oracle数据库查询优化⽅案(处理上百万级记录如何提⾼处理查询速度)1.对查询进⾏优化,应尽量避免全表扫描,⾸先应考虑在 where 及 order by 涉及的列上建⽴索引。
2.应尽量避免在 where ⼦句中对字段进⾏ null 值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=03.应尽量避免在 where ⼦句中使⽤!=或<>操作符,否则将引擎放弃使⽤索引⽽进⾏全表扫描。
4.应尽量避免在 where ⼦句中使⽤ or 来连接条件,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10union allselect id from t where num=205.in 和 not in 也要慎⽤,否则会导致全表扫描,如:select id from t where num in(1,2,3)对于连续的数值,能⽤ between 就不要⽤ in 了:select id from t where num between 1 and 36.下⾯的查询也将导致全表扫描:select id from t where name like '%abc%'若要提⾼效率,可以考虑全⽂检索。
7. 如果在 where ⼦句中使⽤参数,也会导致全表扫描。
因为SQL只有在运⾏时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运⾏时;它必须在编译时进⾏选择。
然⽽,如果在编译时建⽴访问计划,变量的值还是未知的,因⽽⽆法作为索引选择的输⼊项。
如下⾯语句将进⾏全表扫描:select id from t where num=@num可以改为强制查询使⽤索引:select id from t with(index(索引名)) where num=@num8.应尽量避免在 where ⼦句中对字段进⾏表达式操作,这将导致引擎放弃使⽤索引⽽进⾏全表扫描。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR函数和LIKE操作符实现。
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') >0;SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限,因此对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能建立全文检索的步骤步骤一检查和设置数据库角色首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。
如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。
你必须修改数据库以安装这项功能。
默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys的用户。
步骤二赋权在ctxsys用户下把ctx_ddl的执行权限赋于要使用全文索引的用户,例:grant execute on ctx_ddl to pomoho;步骤三设置词法分析器(lexer)Oracle实现全文检索,其机制其实很简单。
即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term)找出来,记录在一组以dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息。
检索时,Oracle 从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。
而lexer则是该机制的核心,它决定了全文检索的效率。
Oracle 针对不同的语言提供了不同的 lexer, 而我们通常能用到其中的三个:n basic_lexer: 针对英语。
它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。
但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上失去检索能力。
以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。
此时若检索‘中国’,将检索不到内容。
n chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。
该分析器按字为单元来分析汉语句子。
‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。
可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。
n chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。
上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。
chinese_lexer的最大改进就是该分析器能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大提高了效率。
但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer. 如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器。
要指定使用哪一个lexer, 可以这样操作:第一.当前用户下下建立一个preference(例:在pomoho用户下执行以下语句)exec ctx_ddl.create_preference ('my_lexer','chinese_vgram_lexer');第二.在建立全文索引索引时,指明所用的lexer:CREATE INDEX myindex ON mytable(mycolumn) indextype isctxsys.contextparameters('lexer my_lexer');这样建立的全文检索索引,就会使用chinese_vgram_lexer作为分析器。
步骤四建立索引通过以下语法建立全文索引CREATE INDEX [schema.]index on [schema.]table(column)INDEXTYPE IS ctxsys.context [ONLINE]LOCAL [(PARTITION [partition][PARAMETERS('paramstring')][, PARTITION [partition][PARAMETERS('paramstring')]])][PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];例:CREATE INDEX ctx_idx_menuname ON pubmenu(menuname)indextype is ctxsys.context parameters('lexermy_lexer')步骤五使用索引使用全文索引很简单,可以通过:select * from pubmenu where contains(menuname,'上传图片')>0全文索引的种类建立的Oracle Text索引被称为域索引(domain index),包括4种索引类型:l CONTEXT2 CTXCAT3 CTXRULE4 CTXXPATH依据你的应用程序和文本数据类型你可以任意选择一种。
对多字段建立全文索引很多时候需要从多个文本字段中查询满足条件的记录,这时就需要建立针对多个字段的全文索引,例如需要从pmhsubjects(专题表)的subjectname(专题名称)和briefintro(简介)上进行全文检索,则需要按以下步骤进行操作:Ø建议多字段索引的preference以ctxsys登录,并执行:EXEC ctx_ddl.create_preference('ctx_idx_subject_pref','MULTI_COLUMN_DATASTORE');Ø 建立preference对应的字段值(以ctxsys登录)EXEC ctx_ddl.set_attribute(' ctx_idx_subject_pref','columns','subjectname,briefintro');Ø 建立全文索引CREATE INDEX ctx_idx_subject ON pmhsubjects(subjectname)INDEXTYPE ISctxsys.CONTEXT PARAMETERS('DATASTOREctxsys.ctx_idx_subject_pref lexer my_lexer')Ø 使用索引select * from pmhsubjects where contains(subjectname,'李宇春')>0全文索引的维护对于CTXSYS.CONTEXT索引,当应用程序对基表进行DML操作后,对基表的索引维护是必须的。
索引维护包括索引同步和索引优化。
在索引建好后,我们可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex):DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,可以查询一下该表,看看有什么内容:SELECT token_text, token_count FROM dr$i_rsk1$I WHEREROWNUM <= 20;这里就不列出查询接过了。
可以看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里,包括term出现的位置、次数、hash值等。
当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表)。
这就用到sync(同步) 和 optimize(优化)了。
同步(sync):将新的term 保存到I表;优化(optimize):清除I表的垃圾,主要是将已经被删除的term从I表删除。
当基表中的被索引文档发生insert、update、delete操作的时候,基表的改变并不能马上影响到索引上直到同步索引。
可以查询视图CTX_USER_PENDING查看相应的改动。
例如:SELECT pnd_index_name, pnd_rowid,TO_CHAR (pnd_timestamp, 'dd-mon-yyyy hh24:mi:ss') timestampFROM ctx_user_pending;该语句的输出类似如下:PND_INDEX_NAME PND_ROWID TIMESTAMP------------------------------ --------------------------------------MYINDEX AAADXnAABAAAS3SAAC06-oct-1999 15:56:50同步和优化方法: 可以使用Oracle提供的ctx_ddl包同步和优化索引一. 对于CTXCAT类型的索引来说,当对基表进行DML操作的时候,Oracle自动维护索引。
对文档的改变马上反映到索引中。
CTXCAT是事务形的索引。
索引的同步在对基表插入,修改,删除之后同步索引。
推荐使用sync同步索引。
语法:ctx_ddl.sync_index(idx_name IN VARCHAR2 DEFAULT NULLmemory IN VARCHAR2 DEFAULT NULL,part_name IN VARCHAR2 DEFAULT NULLparallel_degree IN NUMBER DEFAULT 1);idx_name 索引名称memory 指定同步索引需要的内存。