您的位置:首页 > 运维架构 > 网站架构

ASP.NET网站全文检索(代码部分)

2006-03-24 19:46 357 查看

ASPX页面代码如下:


<tr>


<td class="record" height="20">关 键 词:


<asp:textbox id="txtQuery" accessKey="Q" runat="server" Width="250px" MaxLength="50"></asp:textbox> 


<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>


<a href='<%# DataBinder.Eval(Container.DataItem, "VPath")%>' target="_blank">




<%

# GetTitle(Container.DataItem)%>


</a>


<br>




<%

# GetCharacterization(Container.DataItem)%>


<br>




<i><a 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()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()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) = 0) Then


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()Function GetTitle(ByVal value As Object) As Object


Dim title As String = Convert.ToString(DataBinder.Eval(value, "DocTitle"))




If Not (title Is Nothing) And title.Length > 0 Then


Return title '


Else


Return DataBinder.Eval(value, "Filename")


End If


End Function 'GetTitle




' 取摘要




Protected Function GetCharacterization()Function GetCharacterization(ByVal value As Object) As String


Return Server.HtmlEncode(Convert.ToString(DataBinder.Eval(value, "Characterization")))


End Function




' 取文件尺寸,单位KB




Protected Function GetFileSize()Function GetFileSize(ByVal value As Object) As String


Return Convert.ToString(CInt(Convert.ToInt32(DataBinder.Eval(value, "Size")) / 1000))


End Function

界面外观如下图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: