登陆注册
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();

同类推荐
  • 青少年提高逻辑思维能力训练集——数学思维法训练

    青少年提高逻辑思维能力训练集——数学思维法训练

    当今时代是一个知识爆炸的时代,也是一个头脑竞争的时代;在竞争日益激烈的环境下,一个人想要很好地生存,不仅需要付出勤奋,而且还必须具有智慧。随着人才竞争的日趋激烈和高智能化,越来越多的人认识到只拥有知识是远远不够的。因为知识本身并不能告诉我们如何去运用知识,如何去解决问题,如何去创新,而这一切都要靠人的智慧,也就是大脑思维来解决。认真观察周围的人我们也会发现,那些在社会上有所成就的人无不是具有卓越思维能力的人。
  • 飞扬A

    飞扬A

    低矮陈旧的房屋一片连着一片,绿色的藤蔓缠绕在锈迹斑斑的铁栏上,潮湿的泥土味混合在空气里。橘色的夕阳静静地洒下余晖,横亘在半空的电线交叉着散开,将天空切割成规格不一的形状。偶尔传来走动的声响……
  • 数学教学的趣味游戏设计

    数学教学的趣味游戏设计

    数学是一门逻辑性非常强且非常抽象的学科,要让数学教学变得生动有趣,关键在于教师要善于引导学生,精心设计课堂教学,提高学生的学习兴趣。在数学教学中,教师应当采取多种方法,充分调动学生的好奇心和求知欲,使学生在每一节课中都能感受学习的乐趣、收获成功的喜悦,从而提高学生自主学习和解决问题的兴趣与热情。只有这样,才能使学生愉快轻松地接受数学知识,并取得良好的教学效果。
  • 学生素质教育丛书-美育教育读本

    学生素质教育丛书-美育教育读本

    本套丛书共分为:美育教育读本,在五星红旗下成长,学生素质培养读本,启智教育读本,学生行为规范读本,艰苦奋斗教育读本,传统美德教育读本,禁毒教育读本,家长学校读本,英雄主义教育读本。针对学生素质教育面临的重要问题,详细地论述了学生综合素质教育的基本内容。
  • 中华成语故事全集——自然情景的故事

    中华成语故事全集——自然情景的故事

    成语是表示一般概念的固定词组或句子。任何一种语言都有成语,但与其他语言相比,汉语中的成语不仅数量多,而且历史更悠久、运用更广泛、地位更突出,民族文化的特征也更鲜明。它们大多是从古代的寓言、历史事件、古代诗文和当时的口语中产生的。虽然年代久远,但不少成语至今仍有着极强的生命力。因为它们言简意赅,生动形象,富有表现力,只用简单的几个字就能表现出丰富而深刻的内容。
热门推荐
  • 善文化宝典

    善文化宝典

    张刚忍编著的《善文化宝典》是善文化系列丛书之一,本书收录了关于“善”的名言一百句、“善”的故事一百篇,用这种方式来宣扬“善”,使更多的人通过图书了解“善”、认识“善”、践行“善”,对弘扬传承民族文化,具有非常积极的意义。
  • 争天战纪

    争天战纪

    浩瀚天地,大千世界。种族林立,万势争锋。当远古的神魔已存在传说,当人类仅靠觉醒体内的真灵之血来逆天修行……弱者在大地上嘶吼……强者在天地间咆哮……每个人都想要高高在上,永生不朽。但最终高不过天地的枷锁,逃不掉那万物轮回!既如此……那便与天争高!
  • 走阴人

    走阴人

    清末民初,大清天命已至,时下政局动荡,各地军阀势力割据一方,明争暗夺,挖棺盗宝,清皇陵阴宫棺木下方用于震慑鬼魅之物的“七星煞阵”被触动,以至天地阴灵之物纷纷苏醒,转化为人,借尸还魂……但物性有相生相克,既有鬼妖作祟,亦有正义之士持罡正法。佛门降魔经、茅山符咒术、勾魂法术、奇门遁甲、西域妖术、苗疆蛊术,等等纷纷现世。清末民初时期共有四位阴阳宗师凭己之力,拯救众生安危;这四人正是:“僵尸道长毛小芳、驱魔龙族马氏一家、茅山宗师林九叔、阴阳通使白世宝”。我们就讲讲这个白世宝……(注:起点中文网A级签约作品,请放心点击收藏!)
  • 世界未解之谜之宇宙地球之谜

    世界未解之谜之宇宙地球之谜

    当人类第一次把眼睛投向天空时,他就想知道这浩瀚无垠的天空以及那闪闪发光的星星是怎样产生的。所以,各个民族,各个时代都有种种关于宇宙形成的传说。不过那都是建立在想象和幻想基础上的。今天,虽然科学技术已经有了重大进步,但关于宇宙的成因,仍处在假说阶段。归纳起来,大致有以下这么几种假说。到目前为止,许多科学家倾向于“宇宙大爆炸”的假说。这一观点是由美国著名天体物理学家加莫夫和弗里德曼提出来的。这一假说认为,大约在200亿年以前,构成我们今天所看到的天体的物质都集中在一起,密度极高,温度高达100多亿度,被称为原始火球。这个时期的天空中,没有恒星和星系,只是充满了辐射。
  • 最后一任守序者

    最后一任守序者

    赌晶,是大陆矿产资源过剩衍生的产物。许多晶石在开采后,都有一层表皮,谁也不能在未刮开表皮之前,准确地测量出晶石的价值。有人一夜暴富,有人倾家荡产。阿诺,这个阳光可爱的少年,在家人被屠杀之后,决心背负起整个家族的遗志。他不再是那个巷子里的穷少年。他是维护世界秩序的守序者,是立志成为最强赌晶大师的少年!为了收集齐十一个拥有神秘力量的物品,阿诺前往四个未知的国度。一场惊心动魄的旅程开始了......
  • 朝雪

    朝雪

    一场悲怆的旷世情缘,一次空前绝后的爱情,一位有着皇室血统的流浪艺人,繁音阁内不明来历的女子,究竟谁在苦苦等候,究竟谁将得到救赎……
  • 超次元交易

    超次元交易

    李小飞本是一家小公司的小职员,每天被人呼来喝去,挣着微薄的工资,过着蜗居一样的生活。可是,这一切在李小飞获得超次元交易系统后都变了。恭喜您!与蛇姬波雅-汉库克完成交易,获得霸王色霸气!恭喜您!与纲手完成交易,获得阴封印与怪力!恭喜您!与托尼-屎大颗完成PY交易,获得钢铁战甲一套。......我嘞个去!这是要吊炸天的节奏啊!
  • 冥玄异界:我在彼岸等你

    冥玄异界:我在彼岸等你

    苏暖从小到大都做着同一个梦,这令她感到非常奇怪。一天,一个自称来自彼岸世界的男人来到她面前,彼岸,也就是亡者世界。她是个相信科学的人,但她更相信她的眼睛。自从遇上这个男人,怪事就一件接一件的发生,她的身世之迷也开始渐渐浮出水面,她想知道的,只是真相。————我在彼岸等你。
  • 王俊凯:与你邂逅十二岁

    王俊凯:与你邂逅十二岁

    段子熙是王俊凯的命,他是一名众所周知的人气偶像王俊凯,却喜欢上了比自己小五岁的普通女孩段子熙,缘分牵引着太多东西,两个人本就不应该相爱,却像情侣般相知相识相恋,他们有太多坎坷太多误会,一个月的相处,换来了八年的等待,他苦苦留级几年,只为等待那一个她。(本文的男女主身心干净请勿上升真人)
  • 异界鬼男

    异界鬼男

    一个21世纪的典型宅男,遇到神秘珠子,重生在异界。。。。。。进学园,进宗派,被追杀,斩敌人。。又因为种种原因被迫穿上女装,从此就在男装女装之间互换。。。。