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桌面搜索中

步骤一

先学习如何配置索引服务

  1. 打开开始菜单 管理工具 > 计算机管理

  2. 打开 "服务和应用程序"

  3. 在"索引服务"节点处,右键菜单 新建编录,会出现一个对话框
    名称:就是“编录”的名称了(任意输入)
    位置:存放索引文件的位置(选择即可)
    本列中:
    名称:IndexServer
    位置:I:\IndexServer

  4. 这时“索引服务”节点,会出现一个 "IndexServer" 的子节点

  5. 在 “IndexServer” 处右键、添加 > 目录;会出现一个对话框,添加要索引的 "目录" 在录入一个别名
    本列中:
    别名:Favorite
    路径:I:\QuBinDocs\Favorite\
  6. 重新启动索引服务,在“索引服务”节点那里可以,在服务里设置也可以

好了现在文档索引已经开始建立了,不过如果文件比较多的话会比较长时间
还有,windows 默认是对全盘开 索引服务的,会占用很大空间,我个人习惯都删除了自己在配置
自己需要索引的目录。

建立完索引后如果是自己本机使用是不需要编程的,每一个 “编录” 会提供一个查询页面在“编录”的节点下就有

步骤二

开始实现编程、使任何人都可以访问了,其实很简单的

界面效果(可以看出索引服务已经生效了)

windows 系统调用.Windows索引服务.实列在Web访问索引服务

代码如下(下载的代码中有一些相关的资源在代码最后的地方)

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">
                    
&nbsp;</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 用户可以访问即可.

相关文章:

  • 2021-12-05
  • 2022-12-23
  • 2021-11-21
  • 2021-12-04
  • 2021-12-29
  • 2021-05-13
  • 2021-09-22
  • 2022-01-01
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-14
  • 2021-11-25
  • 2022-12-23
  • 2022-03-07
  • 2022-01-08
相关资源
相似解决方案