需要用经典 ASP (VB) 替换 Server 2012 上的 MS 索引服务
Posted
技术标签:
【中文标题】需要用经典 ASP (VB) 替换 Server 2012 上的 MS 索引服务【英文标题】:Need Replacement for MS Index Service on Server 2012 with Classic ASP (VB) 【发布时间】:2015-10-07 10:56:36 【问题描述】:我刚刚将一个网站从 Server 2003 迁移到 Server 2012,MS Indexing 服务不可用。 在做一些研究时,我发现 MS Search Service 是“替代品”,因此,我将它安装在 Server 2012 上。除此之外,我还没有找到启用所需的 ASP-Classic (VB) 代码新的搜索服务对我的文档进行编目,就像索引服务所做的那样。
MS Search Service 是否具有编目和搜索文档的能力和灵活性,并以与 MS Indexing Service 相同的方式返回结果?
以下是当前调用 MS 索引服务的代码示例(在 Windows 2003 服务器上):
<%
Dim strQuery ' The text of our query
Dim objQuery ' The index server query object
Dim rstResults ' A recordset of results returned from I.S.
Dim objField ' Field object for loop
Dim objUtility
' Retreive the query from the querystring
strQuery = Request.QueryString("CiRestriction")
if strQuery <> "" then
if Request.QueryString("ExactPhrase") = "Yes" then
strQuery = """" & strQuery & """"
end if
end if
' If the query isn't blank them proceed
If strQuery <> "" Then
' Create our index server object
Set objQuery = Server.CreateObject("IXSSO.Query")
' Set its properties
objQuery.Catalog = "Test_Docs" ' Catalog to query
objQuery.MaxRecords = 75 ' Max # of records to return
objQuery.SortBy = "Rank[d], size"
objQuery.Columns = "Characterization, DocTitle, Directory, Filename, Path, Rank, Size, Vpath, Write"
' Build our Query: Hide admin page and FPSE pages
'strQuery = "(" & strQuery & ")" _
' & " AND NOT #filename = *admin*" _
' & " AND NOT #path *\_vti_*"
' Uncomment to only look for files modified last 5 days
'strQuery = strQuery & " AND @write > -5d"
' To set more complex scopes we use the utility object.
' You can call AddScopeToQuery as many times as you need to.
' Shallow includes just files in that folder. Deep includes
' subfolders as well.
'
Set objUtility = Server.CreateObject("IXSSO.Util")
objUtility.AddScopeToQuery objQuery, "d:\test_shares\test_docs", "deep"
objQuery.Query = strQuery ' Query text
Set rstResults = objQuery.CreateRecordset("nonsequential") ' Get a recordset of our results back from Index Server
' Check for no records
If rstResults.EOF Then
Response.Write "Sorry. No results found."
Else
' Print out # of results
Response.Write "<p><strong>"
Response.Write rstResults.RecordCount
Response.Write "</strong> results found:</p>"
' Loop through results
Do While Not rstResults.EOF
' Loop through Fields
' Pretty is as pretty does... good enough:
%>
<%KSize=formatnumber(rstResults.Fields("size"))
KSize= round(KSize/1024,0)%>
<p>
<%'test below using PoorMansIsNull function%>
<% If PoorMansIsNull(rstResults.Fields("DocTitle")) Or rstResults.Fields("DocTitle")="" Then %>
<a href="/ams/test_docs<%= PathToVpath(rstResults.Fields("path")) %>" target="_blank"><%= PathToVpath(rstResults.Fields("filename")) %></a>
<% Else %>
<a href="/ams/test_docs<%= PathToVpath(rstResults.Fields("path")) %>" target="_blank"><font size="3"><%= rstResults.Fields("DocTitle") %></font></a>
<% End If %>
<br><%= rstResults.Fields("Characterization") %><br>
<font color="#009900"><%= PathToVpath(rstResults.Fields("path")) %> - <%= KSize %>k<br /></font>
</p>
<%
' Move to next result
rstResults.MoveNext
Loop
rstResults.MoveFirst
Response.Write "<pre>"
'Response.Write rstResults.GetString()
Response.Write "</pre>"
End If
' Kill our recordset object
Set rstResults = Nothing
Set objUtility = Nothing
Set objQuery = Nothing
End If
%>
</body>
</html>
<%
Function PathToVpath(strPath)
Const strWebRoot = "d:\test_shares\test_docs\"
Dim strTemp
strTemp = strPath
strTemp = Replace(strTemp, strWebRoot, "\")
strTemp = Replace(strTemp, "\", "/")
PathToVpath = strTemp
End Function
%>
并且,将列出每个文档的结果(文档的名称、文档文本的摘录、标题、大小),如下图所示:
感谢任何线索和/或替代方案。
【问题讨论】:
【参考方案1】:这个例子实际上是不正确的。这是行不通的。以下代码:
objRecordSet.Open "SELECT Top 20 " & _
"System.ItemPathDisplay " & _
",System.ItemName " & _
",System.Size " & _
"FROM SYSTEMINDEX", objConnection & _
"WHERE SCOPE='file:E:\MANIF\DAAP\AC'"
应该真正在查询结束时使用连接对象。花了几个小时想知道为什么 WHERE 子句不起作用。
objRecordSet.Open "SELECT Top 20 " & _
"System.ItemPathDisplay " & _
",System.ItemName " & _
",System.Size " & _
"FROM SYSTEMINDEX " & _
"WHERE SCOPE='file:E:\MANIF\DAAP\AC'", objConnection
这应该可以帮助所有遇到同样困难的人。
【讨论】:
当然!代码错了。我刚刚纠正了它。谢谢。【参考方案2】:我也面临同样的问题。我找到了有关此问题的 MS 指南:Querying the Index with Windows Search SQL Syntax。
我已经测试了这个 ASP (Classic) 代码并且运行正常:
<html>
<body>
Results<br>
<ol>
<%
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
'change directory on scope clause
objRecordSet.Open "SELECT Top 20 " & _
"System.ItemPathDisplay " & _
",System.ItemName " & _
",System.Size " & _
"FROM SYSTEMINDEX" & _
" WHERE SCOPE='file:E:\MANIF\DAAP\AC'", objConnection
objRecordSet.MoveFirst
Do Until (objRecordSet.EOF)
%>
<li>
<strong>Path Display:</strong><%=objRecordSet("System.ItemPathDisplay")%><br>
<strong>Name:</strong><%=objRecordSet("System.ItemName")%><br>
<strong>Size:</strong><%=objRecordSet("System.Size")%><br>
<hr>
</li>
<%
objRecordSet.MoveNext
Loop
objRecordSet.Close
Set objRecordSet = Nothing
objConnection.Close
Set objConnection = Nothing
%>
</ol>
</body>
</html>
其他选择:
-
尝试在windows服务器中注册asp dll。我可以看到,没有人在这个方法上取得成功。见this post;
在以前的 windows 版本中创建一个 VM 以支持您的 asp。看到这个MS article。
希望对你有帮助。
【讨论】:
我找到了与此问题相关的this thread。 谢谢。您为此使用的是哪个版本的 Windows Server? windows server 2012 标准 谢谢。这是启用了 Windows 搜索服务与 Windows 搜索服务器吗?此外,如果我有一个包含要搜索的文档的子文件夹和子文件夹的主文件夹,我可以像以前使用旧的 Windows 索引服务那样添加到范围吗?例如我的旧代码是这样的(在循环内从表单下拉列表中获取选定的子文件夹):For yy=0 to Ubound(ArrStrPathInputCourseName) objUtility.AddScopeToQuery objQuery,"e:\bss_web_shares\bsslecturenotes\"& ArrStrPathInputCourseName(yy) &"\", "deep" Next
好吧,我不再参与这些项目了,但我会回答我记得的内容:“这是否启用了 Windows 搜索服务...?” . R- 是的,我相信我们正在使用古老的解决方案 Windows 搜索服务器。关于第二个问题,这就足够了:objUtility.AddScopeToQuery objQuery,"
/","deep"`。我假设“/”被映射到“e:\bss_web_shares\bsslecturenotes\”。以上是关于需要用经典 ASP (VB) 替换 Server 2012 上的 MS 索引服务的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET/VB.NET/SQL Server 2012 - 页面不断加载
从 Sql Server 检索照片到 asp.net 和 Vb.net
怎么用asp 做界面 连接 SQL server 实现 增 删 改