登陆注册
19122000000024

第24章 Oracle的全文搜索(4)

catch(SQLException ex)

{

out.print(ex.getMessage());

}

}

}

%>

</body>

</html>

5.4Oracle大文本列的全文搜索

在Oracle中,大量的文本数据通常存储在大文本(CLOB)类型的列中,Oracle的全文搜索专门对它提供了支持。

5.4.1CLOB的读写方法

本节首先介绍如何读取CLOB中的内容,以及如何向其中写入内容。

首先,创建一个测试表,含有ID和body两个字段,其中body字段为CLOB类型,运行语句如下所示:

CREATE TABLE myclob

ID NUMBER PRIMARY KEY,

bodyCLOB

);

commit;

然后,向表格中写入数据。运行语句如下所示:

insert into myclob values(1,empty clob());

insert into myclob values(2,empty clob());

commit;

要注意,操作CLOB类型不同于varchar类型,要先插入emptyclob(),然后再修改这一列的值。

建立如下PL/SQL过程:

declare

v lobloc clob;

v text VARCHAR2(500):="我爱你!中国!古老伟大的祖国!′;

v amount INT;

v offset INT;

begin

select body into v lobloc from myclob where id=1for update;

v offset:=dbms lob.getlength(v lobloc)+1;

v amount:=length(v text);

dbms lob.write(v lobloc,v amount,v offset,v text);

commit;

end;

这是修改表中的第一行数据,向CLOB类型列中插入数据“我爱你!中国!古老伟大的祖国!”。

5.4.2CLOB的搜索

现在,创建索引,语句如下:

create index idx myclob on myclob(body)indextype is ctxsys.context;

commit;

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

select id,body from myclob where contains(body,"中国")>0;

使用如下语句,运行的结果将更加明显:

select id ||substr(body,0,7)from myclob where contains(body,"中国")>0;

5.5Oracle大二进制列的全文搜索

在Oracle中,使用大二进制(BLOB)类型来存储二进制数据,比如Word文档,PDF文档,HTML文档等。Oracle对许多格式的数据都提供了很好的全文搜索支持。本节先介绍如何读写BLOB类型数据,然后介绍如何对它实现全文搜索。

5.5.1BLOB的读写方法

本节首先介绍如何读取CLOB中的内容,以及如何向其中写入内容。

首先,创建一个测试表,含有id,fname和fblob三个字段。id是文档序号,fname是文档的名称,fblob存储文档的二进制内容。运行语句如下所示:

create table myblob

id number,

fname varchar2(50),

fblob blob

);

现在,通过一个Java程序,实现向数据表中写入二进制数据。程序代码如下。

案例名称:二进制数据的写入

程序名称:OracleInput.java

import java.util.*;

import java.io.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.sql.*;

import oracle.jdbc.OracleResultSet;//使用Oracle的ResultSet对象

import oracle.sql.BLOB;//使用Oracle的BLOB对象,而不是Sun的Blob

public class OracleInput

{

public static void main(String[] args)

{

…Connection conn=null;

Statement stmt=null;

ResultSet rs=null;

try

{

Class.forName("oracle.jdbc.driver.OracleDriver");

}

catch(ClassNotFoundException ce)

{

System.out.println(ce.getMessage());

}

try

{

//获得Connection对象

String url="jdbc:oracle:thin:@ localhost:1521:yuanyuan";

conn=DriverManager.getConnection(url,"scott","tiger");

File file=new File("d:/test/大禹.doc");

conn.setAutoCommit(false);//取消Connection对象的auto commit属性

String fname=file.getName();

//使用EMPTYBLOB()成生一个空blob

int id=0;//每插入一行的时候需要修改这个值

String sql="INSERT INTO myblob(id,fname,fblob)VALUES("+id+",′"+fname+"",EMPTYBLOB())";

stmt=conn.createStatement();

int count=stmt.executeUpdate(sql);

sql="SELECT fblob FROM myblob WHERE id="+id+"FOR UPDATE";//使用FOR UPDATE得到表的写锁

rs=stmt.executeQuery(sql);

rs.next();

BLOB blob=((OracleResultSet)rs).getBLOB("fblob");//得到BLOB对象

OutputStream out=blob.getBinaryOutputStream();//建立输出流

InputStream in=new FileInputStream(file);//建立输入流

int size=blob.getBufferSize();

byte[] buffer=new byte[size];//建立缓冲区

int len;

while((len=in.read(buffer))!=-1)

{

out.write(buffer,0,len);

}

in.close();

out.close();

conn.commit();

System.out.print("二进制数据写入成功!");

}

catch(Exception e)

{

System.out.println(e.getMessage());

}

finally

{

if(rs!=null)

{

try

{

rs.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

if(stmt!=null)

{

try

{

stmt.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

if(conn!=null)

{

try

{

conn.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

}

}

}

重复执行刚才的过程,修改文件的名称和数据库id值。然后查看MYBLOB表格的内容。注意:在表格中没有显示出BLOB类型列,这是Oracle的设定。

现在读取BLOB列中的内容。以下程序读取了第一行数据,将“大禹.doc”的内容显示出来。

案例名称:二进制数据的读取

程序名称:showword.jsp

<%@ page contentType="text/html;charset=gbk"%>

<%@ page import="java.sql.*,java.io.*"%>

<%!

Connection conn=null;

Statement stmt=null;

ResultSet rs=null;

%>

<%

//安装驱动程序——

try

{

071做自己的搜索引擎——搜索引擎精解案例教程

Class.forName("oracle.jdbc.driver.OracleDriver");

}

catch(ClassNotFoundException ce)

{

out.println(ce.getMessage());

}

//执行——

try

{

//获得Connection对象

String url="jdbc:oracle:thin:@ localhost:1521:yuanyuan";

conn=DriverManager.getConnection(url,"scott","tiger");

stmt=conn.createStatement();

rs=stmt.executeQuery("SELECT*FROM myblob where id=0");

if(rs.next())

{

request.setCharacterEncoding("gb2312");

//提供下载

response.setHeader("Content-Disposition","attachment;filename=""+rs.getString("fname")

+""");

Blob blob=rs.getBlob("fblob");

byte[] buf=blob.getBytes(1,(int)blob.length());

response.setContentType("application/msword");

//图片的输出流

OutputStream wt=response.getOutputStream();

//将缓冲区的输入输出到页面

wt.write(buf);

//输入完毕,清除缓冲

wt.flush();

wt.close();

}

}

catch(SQLException e)

{

System.out.println(e.getMessage());

}

finally

{

if(rs!=null)

{

try

{

rs.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

if(stmt!=null)

{

try

{

stmt.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

if(conn!=null)

{

try

{

conn.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

}

%>

需要注意的是,对于不同类型的文档,它们的读取方法相同,但显示的方法却不同。如下的案例用于读取图片数据并显示出来。

案例名称:图片数据的读取和显示

程序名称:BlobShow.java

import java.sql.*;

import javax.swing.*;

public classBlobShow

{

public static void main(String[] args)

{

…Connection conn=null;

Statement st=null;

ResultSet rs=null;

Blob blob=null;

try

{

Class.forName("oracle.jdbc.driver.OracleDriver");

}

catch(ClassNotFoundException ea)

{

ea.printStackTrace();

}

try

{

String url="jdbc:oracle:thin:@ localhost:1521:yuanyuan";

conn=DriverManager.getConnection(url,"scott","tiger");

conn.setAutoCommit(false);

st=conn.createStatement();

同类推荐
  • 感恩故事大全集:无障碍阅读学生版

    感恩故事大全集:无障碍阅读学生版

    程帆主编的《无障碍阅读学生版:感恩故事大全集》精选经典佳作,篇篇震撼心灵。言简意赅的阅读感悟,拨动你的心弦。丰富、精美的插图,非凡的视觉享受。父爱、母爱、亲情、真情,是人世间最美的情感。当你翻开《无障碍阅读学生版:感恩故事大全集》,你会被或真情流露、或清新流畅、或委婉含蓄的作品感动:在文字的流淌中走进作者丰富的内心世界。愿你与我们一起在阅读中感受世间真情,聆听人间大爱,拥有感恩之心。
  • 哈佛考考你

    哈佛考考你

    《哈佛考考你》以轻松、简明的语言阐述了哈佛面试中会考察到的学生必备的智力、能力、品质等各方面的素质,让申请哈佛的学子和有志青年在通过一系列试题的训练中能够更加清楚地认识自己,并有目标地对自己进行培养和提高。
  • 语文新课标课外必读第二辑——鲁滨逊漂流记

    语文新课标课外必读第二辑——鲁滨逊漂流记

    国家教育部颁布了最新《语文课程标准》,统称新课标,对中、小学语文教学指定了阅读书目,对阅读的数量、内容、质量以及速度都提出了明确的要求,这对于提高学生的阅读能力,培养语文素养,陶冶情操,促进学生终身学习和终身可持续发展,对于提高广大人民的文学素养具有极大的意义。
  • 西方大学改革史略

    西方大学改革史略

    众所周知,现代大学诞生于中世纪欧洲,迄今已有九百多年的历史了,但大学改革的历史,严格地说只有两百年。改革的含义是指改掉事物中陈旧的、不合理的部分,使之合理、完善且更加切合需要。
  • 汽车车身修复

    汽车车身修复

    《汽车车身修复》以汽车车身钣金修复的技能为主线,从基本技能到一般技能,再到车身严重损伤的修复技能,分别对应三个模块,即模块一——车身钣金基础,包含安全与防护、车身结构与常用材料、钣金展开放样、手工咸形、气体保护焊、电阻点焊等十个任务;模块二——车身轻微损伤的修复,包含前翼子板的修复、车门面板的修复、车身钢板的收缩、车身铝板的修复、车身塑料件的修复等七个任务,模块三——车身严重损伤的修复,包含车身损伤评估、车身测量技术、车身矫正技术、车身钣金件的更换等四个任务。
热门推荐
  • 遮掩星辰

    遮掩星辰

    每一件事,一定有它的开始。那是还在传说神话时代的事了……悠远的历史,也无法追溯到那时候的事,只有不可为证的口耳相传,没有文献,没有记载。是曾经发生过在这个世界,但是现在已没有人能肯定地说他清楚所有的过程。只是因为,和神扯上了关系。
  • 首席盛宠:枕上小娇妻

    首席盛宠:枕上小娇妻

    谁先动的心不重要,重要的是,我先动了情!他是商业巨子,遇事杀伐果断冷血无情,却偏偏对她无可奈何,宠入心骨。“安浩轩,我要你娶我!必须娶!”“领证去!”她初遇他就爬上了他的床,第二天直接踢门硬闯办公室,直到第三天,她将他拐去了民政局。他们之间兜兜转转,迎来七年重逢......安浩轩,我不要遇见全世界,只要遇见你!陆羽涵,我愿用全世界交换,只为一个你!有人质疑平凡如她,他说:“你说最美的星空在撒哈拉,可你却不知,她是我的极光!”
  • 莱茵哈特

    莱茵哈特

    随着爱琴海航海贸易的兴盛,自称“大海之子,风暴之灵”的莱茵人,开创了空前盛世的大航海时代。如今的爱琴海,“莱茵哈特”这个化龙魔法师的名字,正逐渐成为莱茵人眼里最伟大的君王,奥丁教廷宗教裁判所笔下最头疼的异端,歌特女王心中最惦挂的执念,以及水手和吟游诗人口中最高贵的冒险者……————新建一群,欢迎上贼船。船票:199563496
  • 末世危情:小猫乖乖爱

    末世危情:小猫乖乖爱

    【已经决定全本免费,慢更新勿催】【本文伪兄妹,宠文,男主偏执占有欲强,女强男更强】12岁,他进入了她的生命,身为她继母带来的孩子,他本想将这份感情永远埋在心底,没想到末世来临,一切重启。半兽帅哥,人类指挥官,外星高级人类,雾草,夜哥哥要发飙了,那是我的妹子啊。一切尘埃落定……原来夜哥哥也tm不是正常人。一一妹子哀嚎,她这是惹了一群什么奇葩,她要求1v1~\(≧▽≦)/~【文慢热,已经在加快节奏,不断更,特殊情况请假】
  • 娇宠之狐妃很嚣张

    娇宠之狐妃很嚣张

    梵纤觉得世界无爱了,她不过是一只安分守己的九尾狐王,只想安安分分的度过天劫然后飞渡成狐仙大人,谁知道准备成功时冒出个死道士害她不能度过天劫成仙不说,居然还失去了千年修为变回了一只剩下一条尾巴的小狐狸。好不容易活下来,还阴差阳错到了摄政王手上!可是凭什么动不动就威胁要吃狐狸肉扒狐狸毛?还扬言要打断她的腿?哼!不过一介凡人,你以为你是摄政王就了不起啊!居然敢这么威胁孤。谁愿意就在你身边谁就是傻子!就算你让狐睡你的龙床,就算你给狐洗澡,就算你给孤顺毛,就算你给孤报仇,你以为孤就会感激你了吗?跑,果断跑,待孤的修为都回来了,再来把你生煎活捉!
  • 萌学园之神兽再现

    萌学园之神兽再现

    失踪的人回归,古神兽传承者结局如何......
  • 都市之系统逆袭

    都市之系统逆袭

    被女友嫌弃而惨遭分手的他,能否凭借着突如其来的系统成功逆袭,能否站在世界的巅峰!
  • 一线真金:电话行销话术

    一线真金:电话行销话术

    本书分为十五章,以电话行销的实际操作步骤为切入点,由浅入深地讲解了电话行销的具体操作方法、操作技巧以及提升行销能力的训练,并辅助有大量的经典行销案例。
  • 阴阳式神秘录

    阴阳式神秘录

    生活在岛国的华裔少年受尽了同学们的欺负和排挤,一次突然的妖怪事件改变了他普通高中生的轨迹,一封神秘的来信邀请加入阴阳师学院,真实世界的大门已经打开,制霸日本的梦想,作为阴阳师,实现!本书的各位萌亲们,可以加群,585044352
  • 验光28忌

    验光28忌

    从介绍眼球的基本结构入手,让您了解验光,走出验光误区,学会判别验光正确与否,并教您检影验光方法和“验光28忌”。全书篇幅不长,但却是作者毕生的研究成果和工作感悟。《验光独行侠谈验光28忌》语言朴实、深入浅出,是验光专业人员的良师,是远视、近视患者的益友。