使用Windows搜索服务和SQL Server 2008 R2的全文搜索



当前我正在尝试从SQL Server 2008 R2实例查询Windows搜索服务(也在SQL Server 2012上测试)。Windows搜索正在作为OLE DB DataSource公开,为我提供了几种查询搜索索引的选项。在SQL Server中配置新的链接服务器时,Management Studio为我提供了选择Microsoft Ole DB提供商进行搜索的选项,这意味着我应该能够从SQL Server连接到它。事实证明,将其启动并运行是一个挑战。下面您会发现我偶然发现的错误消息。

ole db提供商" search.collatordso"链接服务器" testserver"返回消息"未准备好"。
MSG 7399,第16级,状态1,第2行
OLE DB提供商" search.collatordso"链接服务器" testserver"报告了一个错误。命令没有准备好。
MSG 7350,16级,状态2,第2行
无法从Ole DB提供商" search.collatordso"获取列信息。

事情变得更加有趣。尽管链接的服务器解决方案无法正常工作,但我能够包装在CLR函数中查询Windows搜索的代码(使用MSDN:以编程方式查询索引),并在SQL Server中使用成功使用。但是,由于设置它所需的步骤(部署库,配置权限等),这是不可取的。我尝试了几个参数设置,没有任何运气。我还尝试过启用一些search.collatordso提供商选项,例如允许提供商将提供商实例化为过程中的服务器。我目前正在使用以下设置。为了安全起见,我正在使用登录的当前安全上下文。

  • 提供者: Microsoft OLE DB Provider for Search
  • 数据来源: (local)
  • 提供者字符串: Provider=Search.CollatorDSO.1;EXTENDED?PROPERTIES="Application=Windows"
  • 位置: -

此外,我需要搜索网络驱动器,可以使用共享Windows库进行操作吗?

我知道,在过去的几年中,越来越多的人一直在努力解决这个问题。我想知道是否有人能够启动并运行,或者可以将我指向正确的方向。

OLEDB Works

普通的ADO/OLEDB组件可以使用连接字符串查询Windows搜索服务:

provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"

和一个示例查询:

SELECT TOP 100000 "System.ItemName",
    "System.ItemNameDisplay",
    "System.ItemType",
    "System.ItemTypeText",
    "System.Search.EntryID",
    "System.Search.GatherTime",
    "System.Search.HitCount",
    "System.Search.Store",
    "System.ItemUrl",
    "System.Filename",
    "System.FileExtension",
    "System.ItemFolderPathDisplay",
    "System.ItemPathDisplay",
    "System.DateModified",
    "System.ContentType",
    "System.ApplicationName",
    "System.KindText",
    "System.ParsingName",
    "System.SFGAOFlags",
    "System.Size",
    "System.ThumbnailCacheId"
FROM "SystemIndex"
WHERE CONTAINS(*,'"Contoso*"',1033)

您可以通过尝试运行:

直接在SQL Server Management Studio中的SQL Server上尝试查询
SELECT *
FROM OPENROWSET(
        'Search.CollatorDSO', 
        'Application=Windows', 
        'SELECT TOP 100 "System.ItemName", "System.FileName" FROM SystemIndex');

给出错误:

OLE DB provider "Search.CollatorDSO" for linked server "(null)" returned message "Command was not prepared.".  
Msg 7399, Level 16, State 1, Line 1  
The OLE DB provider "Search.CollatorDSO" for linked server "(null)" reported an error. Command was not prepared.  
Msg 7350, Level 16, State 2, Line 1  
Cannot get the column information from OLE DB provider "Search.CollatorDSO" for linked server "(null)".  

奖金阅读

  • 使用链接服务器从SQL Server连接到Windows搜索(2011年1月)
  • 与SQL Server链接(2008年5月 - 2012年12月)
  • 尝试从SQL Server访问Windows搜索:applion (2007年7月)
  • 从SQL Server 2008 调用Windows搜索(2011年3月)
  • ole db提供商" search.collatordso"返回"命令"没有准备好。(2014年4月 - 建议CLR解决方法)
  • 链接到Windows搜索的服务器(2011年2月)
  • MSDN博客:在使用search.collatordso提供商(2009年8月 - 建议clr解决方法)
  • Vista Search (2007年2月)
Have a look at this code..It may help
USE [YourDB]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    Create PROC [dbo].[SearchAllTables]
    @SearchStr nvarchar(100)
    AS
    BEGIN
    DECLARE @dml nvarchar(max) = N''        
    IF OBJECT_ID('tempdb.dbo.#Results') IS NOT NULL DROP TABLE dbo.#Results
    CREATE TABLE dbo.#Results
     ([tablename] nvarchar(100), 
      [ColumnName] nvarchar(100), 
      [Value] nvarchar(max))  
    SELECT @dml += ' SELECT ''' + s.name + '.' + t.name + ''' AS [tablename], ''' + 
                    c.name + ''' AS [ColumnName], CAST(' + QUOTENAME(c.name) + 
                   ' AS nvarchar(max)) AS [Value] FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) +
                   ' (NOLOCK) WHERE CAST(' + QUOTENAME(c.name) + ' AS nvarchar(max)) LIKE ' + '''%' + @SearchStr + '%'''
    FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                       JOIN sys.types ty ON c.system_type_id = ty.system_type_id AND c .user_type_id = ty .user_type_id
    WHERE t.is_ms_shipped = 0 AND ty.name NOT IN ('timestamp', 'image', 'sql_variant')
    INSERT dbo.#Results
    EXEC sp_executesql @dml
    SELECT *
    FROM dbo.#Results
    END

相关内容

  • 没有找到相关文章

最新更新