﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我的小船停在代码的海洋中...-随笔分类-Oracle 10g</title><link>http://www.blogjava.net/machilansing/category/14191.html</link><description>Lansing--Coding 不是梦
</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:50:04 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:50:04 GMT</pubDate><ttl>60</ttl><item><title>ORACLE 全文索引功能实现</title><link>http://www.blogjava.net/machilansing/archive/2006/08/17/ORACLE.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Thu, 17 Aug 2006 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2006/08/17/ORACLE.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/64049.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2006/08/17/ORACLE.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/64049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/64049.html</trackback:ping><description><![CDATA[
		<span class="tt1">ORACLE 全文索引功能实现学习笔记 <br /><br />前言： 数据库工程师众所周知的一个事实是，当对数据库里的文本字段进行like检索的时候，任何数据索引都是不起作用的，这样也就导致系统会承担额外的开销和负载压力，对于庞大的数据记录，对其中的文本字段进行关键字匹配，就肯定会存在非常严重的效率障碍和性能障碍。因此，基于文本的全文索引技术也就逐渐兴起。 <br />全文索引的技术原理并不复杂，对段落性的文本内容进行逐词分解，并针对词出现频率，出现位置进行标记，按照词本身的编码顺序存储为索引文件。这样，在针对关键词进行检索的时候，就不会遍历所有的文本数据记录，而是根据索引文件进行有序查找，这里面一个显见的事实是，通过有序索引查找关键词，对于海量的数据记录而言，也只需要很少次数的指针跳转，（数量为X的索引记录，查询特定记录的指针跳转次数最多为Log2(x)。）即可完成搜索，而无须完整遍历整个数据表或文件集。 <br />但是全文索引技术的实现却并不简单，针对中文的尤其如此，英文文本中，空格是天然的分词标记，而中文段落却无法通过这样简单的途径分词，因此基于常用语词典和一些语言识别规则的分词技术成为一种非常高的技术门槛，幸好，很多商业公司提供了非常成熟的商业产品，使我等可以坐享其成，快速搭建全文搜索的平台。 <br /><br />ORACLE INTERMEDIA介绍 <br />ORACLE Intermedia是ORACLE公司官方发布的用来管理多媒体数据的数据库管理模块，通过它可以进行有效的视频，音频，图片等文件的统一存储，调用和相关处理；同时其中也包括一个Oracle Intermdedia Text功能模块，能够对多种格式文档进行分词索引处理，也提供了使用自然语法或高级查询方法进行跨文本查询的途径，可以查询word, PDF,RTF等格式的文件和数据。 <br />Oracle Intermedia 的索引效率和查询效率，据一些公开数据上看要远高于Microsoft的Index Server，而且本身具有平台无关特性，另外作为数据库产品，可以很好的和数据库应用进行整合，这一点也是纯粹的文件索引系统所无法实现的。当然，作为通用的数据库产品，Oracle不可能针对全文索引做到最大限度的优化，因此对于高并发大容量的搜索引擎应用，Oracle的方案可能就无法满足，这一点也是必须提前声明的。 <br /><br />全文索引实现步骤 <br />步骤1：查看Oracle Intermedia是否正确安装。Oracle Intermdeia是Oracle的一个附带模块，安装过程中选择即可。 <br />步骤2：设置词法解析器 <br />oracle根据不同语言，有不同的词法解析器，以下说明我们可能用到的三个 <br />basic_lexer，针对英语环境，以空格为分词标记，同时能分辨一些“噪音”单词，如 “if”, “is”等。 <br />chinese_vgram_lexer，专用的汉语分析器，按字为单元分析中文，算法简单，可以一网打尽中文用词，但是效率差强人意。 <br />chinese_lexer，可以识别大部分常用短语和词汇，不会产生大量冗余数据，有很好的实用性，但是语言支持只能为UTF-8编码，不支持zhs16gbk字符集。 <br />以ctxsys用户登陆系统，执行： <br />begin ctx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end; <br />这里假设我们的语法解析器命名为my_lexer，这个名称也可以根据实际应用变化。 <br />步骤3：建立索引字段 <br />我的测试用例保存在system空间，表名为my_docs，字段名为doc，字段类型为blob，存储标准word doc文件。 <br />仍旧保持ctxsys帐户登陆，执行如下操作 <br />create index system.myindex on system.my_docs(doc) indextype is ctxsys.context parameters(‘lexer’,’my_lexer’) ; <br />步骤4：同步操作（sync）及优化操作 <br />以system 登陆，同步操作执行 <br />exec ctx_ddl.sync_index('myindex'); <br /><br />创建同步定时任务代码如下 <br />VARIABLE jobno number; <br />BEGIN <br />　　DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');', <br />　　SYSDATE, 'SYSDATE + (1/24/4)'); <br />　　commit; <br />　　END; <br />/ <br />以system登陆，优化索引操作执行 <br />exec ctx_ddl.optimize_index('myindex','FULL'); <br />创建优化定时任务代码如下 <br />VARIABLE jobno number; <br />　　BEGIN <br />　　DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');', <br />　　SYSDATE, 'SYSDATE + 1'); <br />　　commit; <br />　　END; <br />/ <br />步骤5：测试 <br />select id from my_docs where contains(doc,'关键字')&gt;0 <br />总结： <br />该学习笔记内容大部分可以通过搜索引擎找到，并非本人原创内容，本文全部经个人在windows平台下，在oracle 9i下测试完成，留档记录，为日后的项目和产品开发做技术准备。 </span>
<img src ="http://www.blogjava.net/machilansing/aggbug/64049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2006-08-17 09:33 <a href="http://www.blogjava.net/machilansing/archive/2006/08/17/ORACLE.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全文索引—CONTAINS语法</title><link>http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Thu, 17 Aug 2006 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/64048.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/64048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/64048.html</trackback:ping><description><![CDATA[
		<strong>全文索引—CONTAINS语法<br /><br /></strong>全文索引—CONTAINS语法<br />全文索引——CONTAINS 语法<br />我们通常在 WHERE 子句中使用 CONTAINS ，就象这样：SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 <br /><br />我们通过例子来学习，假设有表 students，其中的 address 是全文本检索的列。<br />1. 查询住址在北京的学生<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'beijing' )<br />remark: beijing是一个单词，要用单引号括起来。<br /><br />2. 查询住址在河北省的学生<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, '"HEIBEI province"' )<br />remark: HEBEI province是一个词组，在单引号里还要用双引号括起来。<br /><br />3. 查询住址在河北省或北京的学生<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )<br />remark: 可以指定逻辑操作符(包括 AND ，AND NOT，OR )。<br /><br />4. 查询有 '南京路' 字样的地址<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'nanjing NEAR road' )<br />remark: 上面的查询将返回包含 'nanjing road'，'nanjing east road'，'nanjing west road' 等字样的地址。<br />          A NEAR B，就表示条件： A 靠近 B。<br /><br />5. 查询以 '湖' 开头的地址<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, '"hu*"' )<br />remark: 上面的查询将返回包含 'hubei'，'hunan' 等字样的地址。<br />          记住是 *，不是 %。<br /><br />6. 类似加权的查询<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )<br />remark: ISABOUT 是这种查询的关键字，weight 指定了一个介于 0~1之间的数，类似系数(我的理解)。表示不同条件有不同的侧重。<br /><br />7. 单词的多态查询<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )<br />remark: 查询将返回包含 'street'，'streets'等字样的地址。<br />         对于动词将返回它的不同的时态，如：dry，将返回 dry，dried，drying 等等。<img src ="http://www.blogjava.net/machilansing/aggbug/64048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2006-08-17 09:31 <a href="http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g TO_DATE() ora-01830 领悟共勉</title><link>http://www.blogjava.net/machilansing/archive/2006/08/10/62857.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Thu, 10 Aug 2006 13:03:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2006/08/10/62857.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/62857.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2006/08/10/62857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/62857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/62857.html</trackback:ping><description><![CDATA[
		<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">今天在 DRM中报错ora-01830 </font>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">把sql语句输出作了以下的实验，发现是时间多了一个.0</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">后来的办法是先把这个时间转成to_char，再转成to_date</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">SQL&gt; select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:ss') from dual;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:ss') from dual</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">ORA-01830: 日期格式图片在转换整个输入字符串之前结束</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">SQL&gt; select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:sssss') from dual;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:sssss') from dual</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">ORA-01836: 小时与日中的秒发生冲突</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">SQL&gt; select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:ss.sssss') from dual;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:ss.sssss') from dual</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">ORA-01836: 小时与日中的秒发生冲突</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">SQL&gt; select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:ff') from dual;</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">select to_date('2005-10-01 12:01:01.0','yyyy-mm-dd hh24:mi:ff') from dual</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">ORA-01821: 日期格式无法识别</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">------------------------------------------------------------------</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">必须保证传入的字符串和要转换的格式精确匹配</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #d3d3d3" face="Courier" color="#0000ff">SQL&gt; SELECT TO_DATE('11-10-1996-13:51:21','DD/MM/YYYY-HH24') A FROM dual; <br /><br />ERROR: <br />ORA-01830: date format picture ends before converting entire input string.</font>
		</p>
		<p>
				<font face="Courier">
						<font style="BACKGROUND-COLOR: #d3d3d3" color="#0000ff">SQL&gt; SELECT TO_DATE('11-10-1996-13:51:21','DD/MM/YYYY-HH24:MI:SS') B FROM dual; <br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /></font>以上是转载的<br />后来我是这么做的哈：<br /><br />SELECT中将其他表的日期TO_CHAR下，然后再将值在INSERT时TO_DATE!<br />具体的做法如下：<br /><br />SELECT TO_CHAR(parameter,'YYYY-MM-DD HH24:MI:SS') AS TIME<br />FROM TABLE_NAME_1;<br /><br />...<br />...<br /><br />INSERT INTO TABLE_NAME_2<br />(COLUME_NAME_1)<br />VALUE (TO_DATE('"+TIME+"','YYYY-MM-DD HH24:MI:SS'));<br /><br />然后就OK了，呵呵，看来要学的还真多！</font>
		</p>
<img src ="http://www.blogjava.net/machilansing/aggbug/62857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2006-08-10 21:03 <a href="http://www.blogjava.net/machilansing/archive/2006/08/10/62857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>