如何在b/s下做文档的搜索

大海无疆2018 2002-11-15 03:25:50
在b/s下做文档的搜索,各位能否给一点提示
...全文
45 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
joyweimao 2002-11-20
  • 打赏
  • 举报
回复
Notes的查询用FTSearch好象很容易出问题,特别是不建索引的时候。但建了索引之后一般文件比较大,特别是邮件系统一般就不大可能用建索引来进行吧!
我用过一种自己写查询条件,基本思想是在视图中查找每个文件,再在各个文件中按域按选定的值进行字符串匹配,然后直接每条记录配以一定的Html代码Print在网页上。
试过在五千条左右的文档中查询,速度与FtSearch差不多(没建索引)
netnerd 2002-11-20
  • 打赏
  • 举报
回复
下面是查寻处理JSP源程序,另外还需要配置Index Service,这里我不说了,请参阅数据库联机帮助和计算机管理帮助。
运行环境:
数据库 SQL SERVER2000
OS Win2K
数据源 JDBC-ODBC (创建一个名为test的系统DSN,连接数据库为master)

FullSearch.jsp
----------------------------------------------------------------
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>

<%!
public String getStr(String str){
try{
String temp_p = str;
byte[] temp_t = temp_p.getBytes("ISO8859-1");
String temp = new String(temp_t);
return temp;
}catch(Exception e){
}
return "null";
}
%>

<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
</head>

<body background="../images/centerbg.gif">

<%
try{
System.out.println("****************************************************");
String searchString = request.getParameter("contain");
searchString = getStr(searchString);

String serverdriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String serverurl = "jdbc:odbc:test";
String serveruser = "sa";
String serverpassword = "password";

Class.forName(serverdriver);
Connection dbConnection = DriverManager.getConnection(serverurl,serveruser,serverpassword);

String strSql = "EXEC sp_addlinkedserver FileSystem,'Index Server','MSIDXS','system'";
CallableStatement callableStatement = dbConnection.prepareCall(strSql);
if (callableStatement == null || callableStatement.equals(null)){
out.println("exec addlinkedserver failed");
return;
}

strSql = "SELECT * FROM OPENQUERY(FileSystem,";
strSql = strSql + "'SELECT Directory,FileName,DocAuthor,Size,Create,Write ";
strSql = strSql + "FROM SCOPE(\'\' \"d:\\\" \'\') WHERE CONTAINS(\'\'"+ searchString +"\'\') > 0 ";
//strSql = strSql + "AND FileName LIKE ''%.html%'' ')";
strSql = strSql + "')";

System.out.println(strSql);
out.println(strSql+"<br><br>");

PreparedStatement proxyPreparedStatement = dbConnection.prepareStatement(strSql);
ResultSet proxyResultSet = proxyPreparedStatement.executeQuery();
while(proxyResultSet.next()){
String Directory = proxyResultSet.getString(1);
String FileName = proxyResultSet.getString(2);
String DocAuthor = proxyResultSet.getString(3);
String Size = proxyResultSet.getString(4);
String Create = proxyResultSet.getString(5);
String Write = proxyResultSet.getString(6);

out.println("Directory = " + Directory + " | ");
out.println("FileName = " + FileName + " | ");
out.println("DocAuthor = " + DocAuthor + " | ");
out.println("Size = " + Size + " | ");
out.println("Create = " + Create + " | ");
out.println("Write = " + Write);
out.println("<br>");
System.out.println("Directory = " + Directory + " | ");
System.out.println("FileName = " + FileName + " | ");
System.out.println("DocAuthor = " + DocAuthor + " | ");
System.out.println("Size = " + Size + " | ");
System.out.println("Create = " + Create + " | ");
System.out.println("Write = " + Write);
}

strSql = "EXEC sp_dropserver FileSystem";
callableStatement = dbConnection.prepareCall(strSql);
if (callableStatement == null || callableStatement.equals(null)){
out.println("exec dropserver failed");
return;
}

dbConnection.close();

System.out.println("****************************************************");

}catch(SQLException sqle){
out.println(sqle);
}catch (Exception e){
out.println(e);
}
%>

</body>
</html>
jincai78 2002-11-20
  • 打赏
  • 举报
回复
gz
netnerd 2002-11-19
  • 打赏
  • 举报
回复
用Index Service很容易搞定的,需要代码的发信到netnerd@163.net
jeanven 2002-11-19
  • 打赏
  • 举报
回复
微软的索引服务为整个文件系统或者Web文件提供了强大的全文索引服务。在索引服务里查询数据是简单明了的,它还为建筑一个更加稳健的Web网站打了基础。你可以使用索引服务查询语言(Index Service Query Language)或者SQL来对索引服务进行检索,这两者都能返回ADO记录集。

内置的检索对象(Query object)能很容易地把令人印象深刻的搜索特性加到Web网站里。我们就来看看如何使用索引服务查询语言和索引服务检索对象。

索引服务的检索对象
索引服务的检索对象为检索索引目录并返回ADO记录集提供了接口。检索对象包含几种属性,用于控制检索的各个方面以及如何让数据返回。首先,你必须像这样在ASP页面里把检索对象实例化:

<%
set objQuery = Server.CreateObject(“ixsso.Query”)
%>

检索对象的属性
这个对象有好几个属性可以被用来调整你的查询。在以下的部分里,我会讨论到每一个属性并讲解如何设置它们。

目录(catalog)
目录属性定义的是要在检索中使用哪个索引目录。索引服务可以被配置为在单个服务器上拥有多个目录。例如,一台服务器可以拥有一个只位于INETPUB路径(directory)下的Web数据目录,同时还可以拥有另一个整个系统的目录。检索对象的缺省目录是系统目录,除非这台计算机上还安装有IIS(Internet信息服务)。如果安装了IIS,那么缺省的就是Web目录了。

除了可以检索本地目录之外,你还可以检索远程服务器的目录。检索远程目录的句法是: query://hostname/catalog。下面的是设置目录属性的一些例子:

‘Query the Web catalog on the local system
objQuery.Catalog = “web”
‘Query the System catalog on the local system
objQuery.Catalog = “system”
‘Query the Web catalog on the computer www.somehost.com
objQuery.Catalog = “query://www.somehost.com/web”


数据列
对于任何查询,你都希望能够控制其返回的数据,数据列属性就允许你定义每个查询结果所要返回的字段。 表A里是可用的数据列以及这些数据列所包含信息的列表。

表A

数据列
内容

Characterization
索引服务所创建文件的摘要

DocTitle
文档标题——对于HTML文档,就是包含在<TITLE>标签里的文本

Filename
文件名

Path
文件的完整路径,包括其文件名

Rank
文件匹配检索程度的数值

Size
文件大小,以字节为单位

Vpath
文件的虚拟路径,包括其文件名

Write
文件写入的最后时间


这样设置数据列属性:
objQuery.Columns = “Characterization, DocTitle,
_Filename, Path, Rank, Size, Vpath, Write”

SortBy
SortBy属性定义的是数据集应该如何排序。SortBy属性可以用于设置已被选作数据集的任何数据列。你还可以定义结果是以升序还是降序来排列,只用在数据列名称后面追加上[a]或者[d]就行了。缺省的是升序。下面这个例子先按级别(Rank)来升序排列结果,然后再按大小降序排列:

objQuery.SortBy = “Rank[d], size”
定义搜索范围和深度
尽管你能够定义要检索的目录,但是有时你只想在整个目录里搜索一个路径,定义查询范围和深度就可以做到这一点。要定义查询的范围就要调用索引服务Util对象的AddScopeToQuery方法。这个方法接受三个参数:第一,要修改的查询对象;第二,要被使用的范围;第三,搜索的深度。范围是搜索开始的路径名。例如,如果要搜索Samples目录,我就把范围设定为/samples。搜索的深度接受两个值,浅或深。浅检索只把指定的目录名作为范围来检索,而深检索则除了检索指定的目录外还要检索其子目录。下面这个例子说明了如何把Util对象实例化,以及如何调用AddScopeToQuery方法:

Set objUtil = Server.CreateObject(“ixsso.Util”)
ObjUtil.AddScopeToQuery objQuery, “/samples”, “deep”


检索

一旦定义了要查询的范围、查询深度以及如何给结果排序,你就可以编写实际的代码了。在这些例子中,我使用了简易格式的索引服务查询语言(Index Service Query Language Short Form),这是个精简的、易用的检索语言。现在我们看看这个语言里的一些关键字。

Contains
Contains关键字定义的是在目标文档的主体里要找的字或者短语。表B是使用Contains关键字的几种方法。

表B

@contains web server software
搜索包含有web、server和software这些字的文档

@contains “web server software”
搜索包含有 “web server software”这个短语的文档

@contains web near software
搜索web这个字在software这个字附近的文档。结果按照这两个字的匹配程度排序。


Write
如果想要找到特定时间以后修改了的文件,你可以使用Write关键字。Write关键字所独有的特点是能够在搜索中使用时间参数。表C是这种检索的格式。

表C

Search Term
Results

@write > -1n
在过去一分钟内修改过的文档

@write > -1h
在过去一小时内修改过的文档

@write > -1d
在过去一天内修改过的文档

@write > -1w
在过去一周内修改过的文档

@write > -1m
在过去一个月内修改过的文档

@write > -1q
在过去一个季度内修改过的文档

@write > -1y
在过去一年内修改过的文档

@write 02/01/11
自从2002年1月11日以来修改过的文档


Size
Size关键字允许你搜索特定大小的文档。看看表D里的例子。

表D

@size > 1024
返回所有大于1K字节的文档

@size > 1024 & < 1048576
返回所有大于1K字节但是小于1M字节的文档


现在我们来看一个检索对象构成的搜索:

objQuery.Query = “(@contents “”web server software””) & (@write > -1q)”
这个检索将返回包含了“web server software”短语而且在过去一个季度内被修改过了的文档。



把所有的东西都放到一起
现在想要搜索的东西已经定义好了,你就可以开始创建一条记录了,这条记录的检索对象的CreateRecordset方法像以下这样设置:

Set RecSet = objQuery._
CreateRecordset_
(“nonsequential”)

CreateRecordset可以是连续的,也可以是不连续的。作为结果的记录集随后就可以被用来取回查询的结果。下面这个例子说明了一个用于简单检索的ASP页面:

<%
set objQuery =Server.CreateObject("ixsso.Query")
objQuery.Catalog = "web"
objQuery.Columns = "Characterization, DocTitle, Filename, Path, Rank,
Size, Vpath, Write"
objQuery.SortBy = "Rank[d], size"

Set objUtil = Server.CreateObject("ixsso.Util")
objUtil.AddScopeToQuery objQuery, "/", "deep"
objQuery.Query = "(@contents book) & (@write > -1y)"

set RecSet = objQuery.CreateRecordset("nonsequential")

while not RecSet.EOF
Response.Write "<A HREF=""" & RecSet("vPath")
& """>" & RecSet("DocTitle") &
"</A><BR>" & vbCrLf
Response.Write "<b>Summary: </b>" & RecSet("Characterization")
& "<BR>" & vbCrLf
Response.Write "<b>Rank: </b>" & RecSet("Rank")
& "<BR>" & vbCrLf
Response.Write "<b>Size: </b>" & RecSet("Size")
& "<BR>" & vbCrLf
Response.Write "<b>Last Update: </b>" & RecSet("Write")
& "<HR>" & vbCrLf
RecSet.MoveNext
wend
%>

这个ASP页面生成了一个检索结果的简单列表,还包括了文档的链接、文档的摘要、文档匹配检索的程度、文件大小和文件最后更新的日期。

你手头的力量
Windows 2000中微软的索引服务所提供的强大索引和搜索能力是出人意料的。其内置的检索对象使得给Web网站加上让人印象深刻的搜索特性变得更加容易。我给出的小技巧应该能有助于你开始使用这个便捷的特性
Bcbprogramer 2002-11-19
  • 打赏
  • 举报
回复
546545
bolong521 2002-11-19
  • 打赏
  • 举报
回复
这个我刚做过,试了半天经过测试,还是notes本身提供的网络域搜索最好,详细说太多了,你在notes的几个帮助里查找网络域搜索就可以找到答案,如果觉的notes的catalog库的界面不太好,修改一下界面就很好用了。
simaqingfeng 2002-11-18
  • 打赏
  • 举报
回复
用notes的所以系统,先要在数据库中建立全文索引,然后再索引时指定索引的视图,就行,功能上能够满足需要的
shenweijuan 2002-11-18
  • 打赏
  • 举报
回复
抱歉我才发现这里是关于notes 的论坛,我上面说的可能就有点不合适了
shenweijuan 2002-11-18
  • 打赏
  • 举报
回复
我见过用index server 做的全文检索,他是调用系统的索引服务,但用起来也不是太好使用
ansi 2002-11-18
  • 打赏
  • 举报
回复
收藏
daluoboequalto 2002-11-16
  • 打赏
  • 举报
回复
也太麻烦了,Notes本身有个库 名字里面就带一搜索的字样吧
作的还算漂亮。
shi716 2002-11-16
  • 打赏
  • 举报
回复
建议你去看domino的java或lotus script的api.
重点看看DataBase,DocumentCollection,Document几个类,相信会有所收获.
wu_liang_ 2002-11-15
  • 打赏
  • 举报
回复
不用吧,系统自带不就有了,或者用公式:@command(viewshowsearchbar)打开一个缺省的或是一个用户定制的搜索表单啊
大海无疆2018 2002-11-15
  • 打赏
  • 举报
回复
不管怎么说都谢谢你
soup_man 2002-11-15
  • 打赏
  • 举报
回复
我做过c/s的搜索,是用全文索引做的,下面的代码不知道对你有没有用

i=view.FTSearch(bc_condition,0)

If i<>0 Then
Messagebox "共搜索到符合条件的文档"+Str(i)+"个",0+64,"提示信息:"
Set doc=view.getfirstdocument
While Not(doc Is Nothing)
Set item=doc.getfirstitem("SelectUserName")
Call item.appendtotextlist(session.username)
Call doc.save(True,True)
Set doc=view.getnextdocument(doc)
Wend
servername=uidoc.fieldgettext("servername")
databasename=uidoc.fieldgettext("databasename")
'nvgQueryResult导航器默认显示的视图为VWSelect,该视图显示搜索结果
Call ws.opendatabase(servername,databasename,"nvgQueryResult")
doc1.saveoptions="0"
Call doc1.save(True,False)
Call uidoc.close
Call view.clear
Exit Sub
Else
Messagebox "没有满足条件的记录!",0+48,"提示信息:"
End If

535

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 Exchange Server
社区管理员
  • 消息协作社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧