前文 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
>
<
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
>
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
# (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">
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
# GetTitle(Container.DataItem)
%>
</
a
>
<
br
>
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
# GetCharacterization(Container.DataItem)
%>
<
br
>
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<
i
><
a
href
='<%#
DataBinder.Eval(Container.DataItem, "VPath")%
>
' target="_blank">http://
<%
# Request.ServerVariables("SERVER_NAME")
%><%
# DataBinder.Eval(Container.DataItem, "VPath")
%>
</
a
>
-
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
# GetFileSize(Container.DataItem)
%>
k
</
i
>
</
p
>
</
ItemTemplate
>
</
asp:TemplateColumn
>
</
Columns
>
<
PagerStyle
Visible
="False"
></
PagerStyle
>
</
asp:datagrid
>
</
td
>
</
tr
>
后台代码,使用VB.NET书写:
'
绑定查询结果
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
Private
Sub BindSearch()
Sub BindSearch()
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
dbAdapter.SelectCommand = oleDbSelectCommand1
oleDbSelectCommand1.Connection = dbConnection
dbConnection.ConnectionString = "Provider=MSIDXS.1;Integrated Security .='';Data Source=Web"
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
Try
dbAdapter.SelectCommand.CommandText = Command
If CStr(ViewState("KEY")) <> "" Then
dbAdapter.Fill(ds)
rows = ds.Tables(0).Rows.Count
Else
lblResultCount.Text = "请输入关键词进行查询!"
End If
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
If Not ds Is Nothing AndAlso rows > 0 Then
' 自定义分页,与查询逻辑无关
ViewState("TOTALROWS") = rows
CalculatePage()
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
dgResultsGrid.AllowPaging = True
dgResultsGrid.PageSize = CInt(ViewState("PAGESIZE"))
dgResultsGrid.CurrentPageIndex = CInt(ViewState("PAGEINDEX")) - 1
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
lblResultCount.ForeColor = Color.Black
lblResultCount.Text = String.Format("找到 {0} 个相关网页", rows)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
dgResultsGrid.DataSource = ds
dgResultsGrid.DataBind()
dgResultsGrid.Visible = (rows > 0)
Else
ViewState("TOTALROWS") = 0
CalculatePage()
End If
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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()
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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")))
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
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
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
query += String.Format(fmt, String.Join(" ", words))
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
ElseIf type = "exact" Then
query += String.Format(fmt, text)
ElseIf type = "natural" Then
query += String.Format(" AND FREETEXT('{0}')", text)
End If
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
query += " ORDER BY Rank DESC"
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
Return query
End Get
End Property
'
如果网页没有Title,那么使用文件名
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
Protected
Function GetTitle()
Function GetTitle(ByVal value As Object) As Object
Dim title As String = Convert.ToString(DataBinder.Eval(value, "DocTitle"))
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
If Not (title Is Nothing) And title.Length > 0 Then
Return title '
Else
Return DataBinder.Eval(value, "Filename")
End If
End Function
'
GetTitle
'
取摘要
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
Protected
Function GetCharacterization()
Function GetCharacterization(ByVal value As Object) As String
Return Server.HtmlEncode(Convert.ToString(DataBinder.Eval(value, "Characterization")))
End Function
![None.gif](/Images/OutliningIndicators/None.gif)
'
取文件尺寸,单位KB
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
Protected
Function GetFileSize()
Function GetFileSize(ByVal value As Object) As String
Return Convert.ToString(CInt(Convert.ToInt32(DataBinder.Eval(value, "Size")) / 1000))
End Function
界面外观如下图:
![fullsitesearch.jpg](https://i-blog.csdnimg.cn/blog_migrate/10295fed2f2e7725161842ddffc11b20.jpeg)