windows 系统调用.Windows索引服务.实列在Web访问索引服务
windows 系统调用.Windows索引服务.实列在Web访问索引服务
[下载代码 / download]
涉及技术
MSIDXS OLDB 驱动程序
取得扩展名对应的 mime 类型( 不知道文件的mime无法设置,Response.ContentType 无法实现下载功能 )
索引服务相关,知识及查询语句
编程背景(假设)
IndexServer 公司重199X 年起建立了一个文档共享服务器(ServerA) ,在此存放各种文档如word,pdf等
但由于现在文件存放过多导致,检索文件非常困难。所以 IndexServer 公司需要在其共享文件服务器上快速检索、大家共享的文件并、提供Web,
检索下载界面。
编程需求
1. 实现对收藏文件,的全文检索(除了文本文件外还要有 office文件,pdf 等文件的检索功能)
2. 提供下载功能
分析
windows2000 开始ms提供了,索引服务、可以利用,不过默认是不支持 PDF 的。
网上有好多索引服务插件,可以下载可以解决 PDF 无法索引的问题、
如下地质 http://addins.china.msn.com/addins_category_desktop.aspx 就有,还可以用在MS桌面搜索中
步骤一
先学习如何配置索引服务
- 打开开始菜单 管理工具 > 计算机管理
- 打开 "服务和应用程序"
- 在"索引服务"节点处,右键菜单 新建编录,会出现一个对话框
名称:就是“编录”的名称了(任意输入)
位置:存放索引文件的位置(选择即可)
本列中:
名称:IndexServer
位置:I:\IndexServer
- 这时“索引服务”节点,会出现一个 "IndexServer" 的子节点
- 在 “IndexServer” 处右键、添加 > 目录;会出现一个对话框,添加要索引的 "目录" 在录入一个别名
本列中:
别名:Favorite
路径:I:\QuBinDocs\Favorite\
- 重新启动索引服务,在“索引服务”节点那里可以,在服务里设置也可以
好了现在文档索引已经开始建立了,不过如果文件比较多的话会比较长时间
还有,windows 默认是对全盘开 索引服务的,会占用很大空间,我个人习惯都删除了自己在配置
自己需要索引的目录。建立完索引后如果是自己本机使用是不需要编程的,每一个 “编录” 会提供一个查询页面在“编录”的节点下就有
步骤二
开始实现编程、使任何人都可以访问了,其实很简单的
界面效果(可以看出索引服务已经生效了)
代码如下(下载的代码中有一些相关的资源在代码最后的地方)
Web config 配置,编录名<appSettings>
<add key="FileIndexName" value="IndexServer" />
</appSettings>ASP.net 页面
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td style="width: 100px">
查询编录</td>
<td style="width: 100px">
<asp:TextBox ID="txtIndex" runat="server" ReadOnly="true" Text="<%$ AppSettings:FileIndexName %>"></asp:TextBox></td>
<td style="width: 100px">
</td>
</tr>
<tr>
<td style="width: 100px">
查询词条</td>
<td style="width: 100px">
<asp:TextBox ID="txtQueryText" runat="server"></asp:TextBox></td>
<td style="width: 100px">
</td>
</tr>
<tr>
<td style="width: 100px">
</td>
<td style="width: 100px">
</td>
<td style="width: 100px">
</td>
</tr>
</table>
</div>
<asp:Button ID="btnQuery" runat="server" OnClick="btnQuery_Click" Text="Button" /><br />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width="100%" DataKeyNames="Path" OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:BoundField DataField="RANK" HeaderText="匹配度" />
<asp:BoundField DataField="FILENAME" HeaderText="文件名" />
<asp:BoundField DataField="SIZE" HeaderText="大小(byte)" />
<asp:BoundField DataField="WRITE" HeaderText="最后更新时间" />
<asp:BoundField DataField="HITCOUNT" HeaderText="匹配字数" />
<asp:ButtonField HeaderText="" Text="下载" CommandName="download" />
</Columns>
</asp:GridView>
</form>
</body>
程序查询:protected void btnQuery_Click(object sender, EventArgs e)
{
string text = txtQueryText.Text.Trim();
if (text.Length > 0)
{
using (OleDbConnection conn = new OleDbConnection("PROVIDER=MSIDXS;DATA SOURCE=" + txtIndex.Text))
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = string.Format(@"select Rank
,HitCount
,Filename
,Size
,Write
,PATH
from Scope() where CONTAINS ( '{0}') order by Rank desc,WRITE desc", txtQueryText.Text.Trim());
//MSIDXS 不支持参数
//cmd.Parameters.Add("Pram1",OleDbType.VarWChar);
//cmd.Parameters[0].Value = txtQueryText.Text;
using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
{
using (DataTable dt = new DataTable())
{
da.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
}
}
}
下载文件代码:protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if(e.CommandName.ToLower()== "download")
{
GridView gv = sender as GridView;
if(gv!=null)
{
string path = gv.DataKeys[ Convert.ToInt32( e.CommandArgument) ].Values[0].ToString();
downloadFile(path);
}
}
}
private void downloadFile(string FullPath)
{
string extension = Path.GetExtension(FullPath);
string fileName = Path.GetFileName(FullPath);
string ct="";
try
{
//取得扩展名对应的 mime 类型
RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(extension);
ct = regKey.GetValue("Content Type") as string;
}
catch(Exception ex)
{
Debug.Write(ex.Message);
}
if (ct == null) //没取到的就按照文件
ct = "application/octet-stream";
this.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));
this.Response.ContentType = ct;
this.Response.WriteFile(FullPath);
this.Response.End();
}
最后把 I:\QuBinDocs\Favorite\ NTFS 权限设置为 ASPNET 用户可以访问即可.