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

<%
# (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
界面外观如下图:
