前文 ASP.NET网站全文检索  主要是收集整理的一些资料,本文是使用Microsoft Indexing Service进行网站全文检索的代码部分,配置部分见这里。 

ASPX页面代码如下:

<tr>
    
<td class="record" height="20">关 键 词:
    
<asp:textbox id="txtQuery" accessKey="Q" runat="server" Width="250px" MaxLength="50"></asp:textbox>&nbsp;
    
<asp:button id="btnSearch" runat="server" Text="搜索" EnableViewState="False"></asp:button></td>
</tr>
<tr>
    
<td height="10">查询方式:
    
<asp:dropdownlist id="cboQueryType" accessKey="T" runat="server" Width="250px" EnableViewState="False">
    
<asp:ListItem Value="All" Selected="True">包含全部的字词</asp:ListItem>
    
<asp:ListItem Value="Any">包含任何一个字词</asp:ListItem>
    
<asp:ListItem Value="Boolean">布尔表达式查询</asp:ListItem>
    
<asp:ListItem Value="Exact">全字匹配</asp:ListItem>
    
<asp:ListItem Value="Natural">自然语言查询</asp:ListItem>
    
</asp:dropdownlist>
    
</td>
</tr>
<tr>
    
<td class="record" height="20">查询范围:
    
<asp:dropdownlist id="cboDirectory" accessKey="D" runat="server" Width="250px" EnableViewState="False">
    
<asp:ListItem Value="/" Selected="True">整个网站</asp:ListItem>
    
</asp:dropdownlist>
    
</td>
</tr>
<tr>
    
<td class="record" height="20"><asp:label id="lblResultCount" runat="server" Font-Italic="True" visible="False" EnableViewState="False"></asp:label></td>
</tr>
<tr>
    
<td vAlign="top" height="210">
    
<asp:datagrid id="dgResultsGrid" runat="server" PageSize="15" AllowPaging="True" AutoGenerateColumns="False"
        Visible
="False" GridLines="None" EnableViewState="False">
        
<ItemStyle HorizontalAlign="Left" VerticalAlign="Top"></ItemStyle>
        
<HeaderStyle Font-Bold="True"></HeaderStyle>
        
<Columns>
            
<asp:TemplateColumn HeaderText="排名">
                
<HeaderStyle Width="40px"></HeaderStyle>
                
<ItemTemplate>
                    
<%# (cint(DataBinder.Eval(Container, "DataSetIndex"))) + 1 %>
                    
</ItemTemplate>
                    
</asp:TemplateColumn>
                    
<asp:TemplateColumn HeaderText="文档信息">
                    
<ItemStyle HorizontalAlign="Left" VerticalAlign="Top"></ItemStyle>
                    
<ItemTemplate>
                    
<p>
                    
<href='<%# DataBinder.Eval(Container.DataItem, "VPath")%>' target="_blank">
                    
<%# GetTitle(Container.DataItem)%>
                    
</a>
                    
<br>
                    
<%# GetCharacterization(Container.DataItem)%>
                    
<br>
                    
<i><href='<%# DataBinder.Eval(Container.DataItem, "VPath")%>' target="_blank">http://<%# Request.ServerVariables("SERVER_NAME")%><%# DataBinder.Eval(Container.DataItem, "VPath")%></a>
                    -
                    
<%# GetFileSize(Container.DataItem)%>
                    k 
</i>
                    
</p>
                
</ItemTemplate>
            
</asp:TemplateColumn>
            
</Columns>
        
<PagerStyle Visible="False"></PagerStyle>
    
</asp:datagrid>
    
</td>
</tr>

后台代码,使用VB.NET书写:

 

 ' 绑定查询结果
        Private Sub BindSearch()

            
Dim dbAdapter As OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter
            
Dim oleDbSelectCommand1 As OleDbCommand = New System.Data.OleDb.OleDbCommand
            
Dim dbConnection As OleDbConnection = New System.Data.OleDb.OleDbConnection
            
Dim ds As DataSet = New DataSet("Results")
            
Dim rows As Integer = 0

            dbAdapter.SelectCommand 
= oleDbSelectCommand1
            oleDbSelectCommand1.Connection 
= dbConnection
            dbConnection.ConnectionString 
= "Provider=MSIDXS.1;Integrated Security .='';Data Source=Web"

            Try
                dbAdapter.SelectCommand.CommandText 
= Command
                
If CStr(ViewState("KEY")) <> "" Then
                    dbAdapter.Fill(ds)
                    rows 
= ds.Tables(0).Rows.Count
                
Else
                    lblResultCount.Text 
= "请输入关键词进行查询!"
                End If

                
If Not ds Is Nothing AndAlso rows > 0 Then
                    
' 自定义分页,与查询逻辑无关
                    ViewState("TOTALROWS"= rows
                    CalculatePage()

                    dgResultsGrid.AllowPaging 
= True
                    dgResultsGrid.PageSize 
= CInt(ViewState("PAGESIZE"))
                    dgResultsGrid.CurrentPageIndex 
= CInt(ViewState("PAGEINDEX")) - 1

                    lblResultCount.ForeColor 
= Color.Black
                    lblResultCount.Text 
= String.Format("找到 {0} 个相关网页", rows)

                    dgResultsGrid.DataSource 
= ds
                    dgResultsGrid.DataBind()
                    dgResultsGrid.Visible 
= (rows > 0)
                
Else
                    ViewState(
"TOTALROWS"= 0
                    CalculatePage()
                
End If

            
Catch ex As Exception
                lblResultCount.ForeColor 
= Color.Red
                lblResultCount.Text 
= String.Format("无法执行特定的查询: {0}", ex.Message)
                dgResultsGrid.Visible 
= False
            
Finally
                lblResultCount.Visible 
= True
            
End Try
            ' 自定义分页
            BindNavigate()

        
End Sub


 

Private ReadOnly Property Command() As String
            
Get
                
Dim query As String
                query 
= String.Format("SELECT Rank, VPath, DocTitle, Filename, Size, Characterization, Write FROM SCOPE('DEEP TRAVERSAL OF ""{0}""') WHERE  Not CONTAINS(FileName,'""*.txt"" OR ""*.js"" OR ""*.css"" OR ""*.config"" OR ""*.xml""')"CStr(ViewState("DIR")))

                
Dim type As String = CStr(ViewState("TYPE")).ToLower()
                
Dim fmt As String = " AND (CONTAINS('{0}') OR CONTAINS(DocTitle, '{0}'))"
                Dim text As String = CStr(ViewState("KEY")).Replace(";""").Trim

                
If type = "all" Or type = "any" Or type = "boolean" Then
                    
Dim words() As String = Split(text, " ")
                    
Dim len As Integer = words.Length
                    
Dim i As Integer

                    
For i = 0 To len - 1 Step i + 1
                        
Dim word As String = words(i)
                        
If type = "boolean" AndAlso (String.Compare(word, "and"True= 0 OrElse String.Compare(word, "or"True= 0 OrElse String.Compare(word, "not"True= 0 OrElse String.Compare(word, "near"True= 0Then
                        
ElseIf word <> "" Then
                            words(i) 
= String.Format("""{0}""", word)

                            
If i < len - 1 Then
                                
If type = "all" Then
                                    words(i) 
+= " AND"
                                ElseIf type = "any" Then
                                    words(i) 
+= " OR"
                                End If
                            
End If
                        
End If
                    
Next

                    query 
+= String.Format(fmt, String.Join(" ", words))

                
ElseIf type = "exact" Then
                    query 
+= String.Format(fmt, text)
                
ElseIf type = "natural" Then
                    query 
+= String.Format(" AND FREETEXT('{0}')", text)
                
End If

                query 
+= " ORDER BY Rank DESC"

                Return query
            
End Get
        
End Property

 

        ' 如果网页没有Title,那么使用文件名
        Protected Function GetTitle(ByVal value As ObjectAs Object
            
Dim title As String = Convert.ToString(DataBinder.Eval(value, "DocTitle"))

            
If Not (title Is NothingAnd title.Length > 0 Then
                
Return title '
            Else
                
Return DataBinder.Eval(value, "Filename")
            
End If
        
End Function
 'GetTitle

        
' 取摘要
        Protected Function GetCharacterization(ByVal value As ObjectAs String
            
Return Server.HtmlEncode(Convert.ToString(DataBinder.Eval(value, "Characterization")))
        
End Function


        
' 取文件尺寸,单位KB
        Protected Function GetFileSize(ByVal value As ObjectAs String
            
Return Convert.ToString(CInt(Convert.ToInt32(DataBinder.Eval(value, "Size")) / 1000))
        
End Function


界面外观如下图:


posted on 2004-10-27 14:36  zhumk  阅读(5944)  评论(8编辑  收藏  举报