博客登录
用户名:
密 码:
注册
|
登录
忘记密码?
51cto首页
|
博客
|
论坛
|
招聘
热点文章
在服务器系统Windows 20..
帮助
转载
:2
翻译
:1
原创
:75
豪客城
http://wakan.blog.51cto.com
>
复制链接
邀请加入技术圈
加友情链接
发短消息
相册
技术圈
博客
51CTO
首页
|
技术论坛
|
短消息
博 客
我的博客
发表文章
管理博客
技术圈
创建圈子
我的圈子
寻找圈子
相 册
我的相册
上传图片
管理相册
首页
|
Java
|
Delphi
|
想笑就笑
|
Google
|
他山之玉
|
真人CS
|
XML
|
仙人指路
|
UML
|
招纳贤士
|
剑法三套
|
驴天驴地
|
SUSE
公告
如需转载本博文章,请先与我联系,切勿不告而取。
EMail:jwk@263.net
QQ:185452
热门文章
说说我的健康经验,您也..
适者生存,PC-Cillin 不..
北京移动,做人不能无耻..
剑法三套,程序员也能挣..
剑法三套,程序员也能挣..
Use Case 中 include 与 ..
剑法三套,程序员也能挣..
LINUX下超级实用的免费字..
英雄舞台
风云单车
最新评论
august
:
我也咨询过类似问题,法律界都有两..
ifedora
:
那请问,你平时是用哪种界面?CLI?..
漠北
:
博主的后续那 0,0。。挖了坑得填呃..
漠北
:
博主的后续那 0,0。。挖了坑得填呃..
豪客
:
coming soon...
51CTO推荐博文
更多..
用无桌面Linux管理有桌面的..
linux下随机数字的生成
灾难恢复域控后sysvol未开..
CCNA系列之IP路由基础
ADO.NET之数据插入、修改、..
细说Java的继承
再看序列化与反序列化
序列化与反序列化的简便实..
北大人民医院CIO:息化提升..
网络外包工程师的初旅
综合布线之“五星对话”
项目经理如何创建工作分解..
你的心态决定你的成败!
大学考试的风流往事
都市奔三族黯然离场,剩下8..
大学校园里那个募捐女孩
博客统计信息
51cto博客之星
用户名:豪客
文章数:79
评论数:875
访问量:199097
无忧币:3926
博客积分
:3931
博客等级:7
注册日期:2006-10-26
51CTO推荐博客
刘源
Shenleigang
Chinaperrylee
xyjhf321
李云
Realzjy
FinderCheng
vfast_chenxy
张广斌
朱坤
wws5201985
月之暗面
文章
文章列表>>
在项目中集成 Google Desktop,提供全文检索能力
2006-03-13 21:40:00
在项目中,需要对客户资料和文件进行全文检索。考虑到 Google Desktop 强大的检索能力,决定把它集成到项目中,从而简化项目方案,加快进度。
1、用户从 Client 端浏览器中发出查询请求,例如:
“[url]http://server:8080/search.jsp?keyword=[/url]网络管理”
2、search.jsp 构建出特殊的 URL,访问 Google Desktop:
“[url]http://127.0.0.1:4664/search&s=C4gKVsZ-bAyBaEwxsW2FKoAAqr0&q=%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86[/url]”
其中:
(1)127.0.0.1 是本机的 IP 地址,4664 是 Google Desktop 的监听端口号;
(2)“search&s=C4gKVsZ-bAyBaEwxsW2FKoAAqr0”是 Google Desktop 的特殊参数,注:“s=”后边的内容,不同的机器内容不一样,暂且称之为 serial,下文中有说明;
(3)“q=%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86”是被搜索的关键词,“网络管理”的 UTF-8 编码,再经过 java.net.URLEncoder.encode() 之后的结果;
3、Google Desktop 从本地硬盘上(假定是 E:\Docs)的资料中检索出符合条件的数据;(实际上这是事先就建好索引,并不是被调用时再去读取的)
4、Google Desktop 把结果返回给 search.jsp。这是一个 UTF-8 编码的大字符串;
5、search.jsp 把检索结果进行一系列处理后(例如去掉 Google 的 LOGO、权限过滤、格式调整、文件名变换、超级链接重定位等),返回给客户端浏览器。有一件事是要做的:把检索结果中形如“E:\Docs\abc.doc”的文件路径换成“/getfile.jsp?filename=abc.doc”,否则客户端打不开该链接;
6、客户单击了那些他感兴趣的文档资料的链接,该链接形如:
“[url]http://server:8080/getfile.jsp?filename=abc.doc[/url]”
7、getfile.jsp 从本地硬盘(E:\Docs)中读出 abc.doc。(在读出之前,可以加入权限判断功能,检查当前用户是否具备访问 abc.doc 的权限)
8、getfile.jsp 以二进制的方式把文件内容(abc.doc)返回给 Client 端浏览器,浏览器将根据文件的类型自动调用相关联的 Windows 程序(MS Word)打开文件。
本方案的关键之处是在第 2 步中构建合理的 URL。而该 URL 中,比较困难的是 “search&s=C4gKVsZ-bAyBaEwxsW2FKoAAqr0”。该内容在不同的机器上,可能不一样,但在同一台机器上,却是固定的,所以只需要手工寻找一次即可。
寻找该 serial 的方法是:
1、在安装了 Google Desktop 的服务器上,双击屏幕右下角的 Google Desktop 图标,系统将自动打开 IE,并出现桌面搜索的主页面;同时在 IE 的地址栏中将出现形如“[url]http://127.0.0.1:4664/&s=UNBXCjdtJHM6yrJXNAfPo4xw6eQ[/url]”的 URL;
2、在主页面上的空白处单击鼠标右键,“查看源文件”,并查找类似于“<FORM name=f method=GET action='/search&s=C4gKVsZ-bAyBaEwxsW2FKoAAqr0'>”的代码,看见了吧?“action=”后边的那一串,就是要寻找的目标;
本演示方案中,共涉及两个 JSP 文件:
1、search.jsp:负责构建正确的 URL,并对返回的结果作出分析、过滤、替换、权限检查等操作;
2、getfile.jsp:负责检查权限,然后从硬盘上读取相关的文件资料,返回给客户端;
由于我还不太会用赛迪的 BLOG,不知道如何实现图文混排(试了一次,好象不成功),所以在此只给出关键代码的示例,search.jsp 可仿照着写:
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class GoogleDesktopConnect {
/* 这就是双击屏幕右下角的 Google Desktop 图标后,出现在 IE 地址栏中的内容 */
private static String urlInit = "[url]http://127.0.0.1:4664/&s=UNBXCjdtJHM6yrJXNAfPo4xw6eQ[/url]";
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String word = "网络管理";
GoogleDesktopConnect google = new GoogleDesktopConnect();
google.connect(urlInit, word);
}
private void connect(String strStartURL, String word){
try {
/* 从首页中自动分析出 search&s=C4gKVsZ-bAyBaEwxsW2FKoAAqr0*/
String serial = getSerial(strStartURL);
System.out.println("serial=" + serial);
/* 构建合适的 URL */
String newWord = java.net.URLEncoder.encode(word, "UTF-8");
String strUrl = "[url]http://127.0.0.1:4664/search&s=[/url]" + serial + "&q=" + newWord;
System.out.println("\n" + strUrl + "\n");
/* 连接 Google Desktop */
URL url = new URL(strUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(false);
con.setDoInput(true);
con.setRequestMethod("GET");
/* 重要!如果不设置代理,Google Desktop 将返回错误信息 */
con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
con.connect();
/* 从 Google Desktop 中接收检索结果 */
InputStream is = con.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b = is.read();
while (b >= 0) {
bos.write(b);
b = is.read();
}
String result = bos.toString("UTF-8");
con.disconnect();
// 接下来可以对 result 进行各种处理,例如权限检查、内容过滤、格式转换、URL 地址转换等
System.out.println(result);
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
根据 urlInit,读取 Google Desktop 的初始页面,并从页面中分析出 serial
*/
private String getSerial(String strUrl) {
String serial = null;
try {
URL url = new URL(strUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(false);
con.setDoInput(true);
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
con.connect();
InputStream is = con.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b = is.read();
while (b >= 0) {
bos.write(b);
b = is.read();
}
String helloPage = bos.toString("UTF-8");
System.out.println(helloPage);
/* 查找 action='/server&s= */
int p = helloPage.indexOf("action='/search&s=");
/* 得到 serial */
serial = helloPage.substring(p+18, p+45);
}
catch (Exception e) {
e.printStackTrace();
}
return serial;
}
}[/img]..
类别:Google
|
阅读全文(1392)
|
回复(4)