使用 ISearchQueryHelper 查询索引

可以使用 ISearchQueryHelper 接口来查询索引。 此接口作为 ISearchCatalogManager (和 ISearchCatalogManager2) 的帮助程序类实现,并通过调用 ISearchCatalogManager::GetQueryHelper 获取。 此接口允许你:

  • 获取 OLE DB 连接字符串以连接到 Windows 搜索数据库。
  • 将高级查询语法 (AQS) 用户查询转换为 Windows 搜索结构化查询语言 (SQL) 。
  • 指定可在 SQL 中表示但不能在 AQS 中表示的查询限制。

本主题的组织方式如下:

使用 ISearchQueryHelper 入门

在开始使用 ISearchQueryHelper 接口以编程方式查询 Windows 搜索之前,应注意一些关键接口和方法。 概括而言,需要执行以下步骤:

  1. 实例化 ISearchManager 实例。

    // Create ISearchManager instance
    ISearchManager* pSearchManager;
    
    // Use library SearchSDK.lib for CLSID_CSearchManager.
    hr = CoCreateInstance(CLSID_CSearchManager, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pSearchManager));      
    
  2. 使用 ISearchManager::GetCatalog 获取 ISearchCatalogManager 的实例。 Windows 搜索的系统目录的名称为 SYSTEMINDEX

    // Create ISearchCatalogManager instance 
    ISearchCatalogManager* pSearchCatalogManager;
    
    // Call ISearchManager::GetCatalog for "SystemIndex" to access the catalog to the ISearchCatalogManager
    hr = pSearchManager->GetCatalog(L"SystemIndex", &pSearchCatalogManager);
    
    
  3. 使用 ISearchCatalogManager::GetQueryHelper 获取 ISearchQueryHelper 的实例。

    // Call ISearchCatalogManager::GetQueryHelper to get the ISearchQueryHelper interface
    ISearchQueryHelper* pQueryHelper;
    
    hr = pSearchCatalogManager->GetQueryHelper(&pQueryHelper);
    
    
  4. 拥有 ISearchQueryHelper 实例后,可以获取用于连接到 Windows 搜索索引 OLE DB 连接器的连接字符串。

    // Call get_ConnectionString to get the OLE DB connection string
    LPWSTR pszConnectionString=NULL;
    
    hr = pQueryHelper->get_ConnectionString(&pszConnectionString);
    // NOTE: YOU MUST call CoTaskMemFree() on the string
    
    

使用 GenerateSqlFromUserQuery 方法

ISearchQueryHelper::GenerateSQLFromUserQuery 方法将用户输入转换为 SQL 查询字符串,然后将其提交到适用于 Windows 搜索的 OLE DB 提供程序。 此方法将高级 查询语法 (AQS) 或自然查询语法 (NQS) 查询转换为 SQL,并允许根据需要添加其他 SQL 片段。

SQL 查询字符串按以下形式返回:

SELECT <QuerySelectColumns> 
FROM <CatalogName that created query helper>
WHERE <Result of interpreting the user query passed into this function according to QuerySyntax>
      [ AND|OR <QueryWhereRestrictions> ]
    

下面是从调用 GenerateSQLFromUserQuery("comput")返回的 SQL 字符串的示例:

SELECT "System.ItemUrl" 
FROM "SystemIndex" 
WHERE ((CONTAINS(*,'"comput*"',1033) RANK BY COERCION(Absolute, 1)) OR 
       (FREETEXT(("System.ItemNameDisplay":0.9, *:0.1), 'comput', 1033) AND CONTAINS(*,'"comput"',1033)))
ORDER BY "System.ItemUrl"

注意

方法会生成 FREETEXT 和 CONTAINS 谓词,因为仅 CONTAINS 不会生成有意义的排名。

 

使用区域设置标识符

方法 说明
ISearchQueryHelper::get_QueryContentLocale/
ISearchQueryHelper::p ut_QueryContentLocale
获取/将语言代码标识符 (查询的 LCID) 。 这有助于获取正确的断字器和词干分析器,以将查询词与目录/倒排索引进行比较。 默认值为当前输入区域设置。
ISearchQueryHelper::get_QueryKeywordLocale/
ISearchQueryHelper::p ut_QueryKeywordLocale
获取/放置语言的 LCID,以便在分析高级查询语法 (AQS) 关键字时使用。 默认值为默认用户区域设置。

 

内容区域设置关键字 (keyword) 区域设置是 LCID) (区域设置标识符,通过标识查询词的语言和 AQS 关键字的语言来帮助搜索引擎使用正确的断字符。 它们并不总是相同的 LCID,因为 Windows 搜索在多个国际版本中提供,并且还包括多语言用户界面 (MUI) 包,适用于更多语言。 内容区域设置标识用户输入搜索查询的语言的 LCID,而关键字 (keyword) 区域设置标识搜索引擎在分析高级查询语法 (AQS) 关键字时使用的 LCID。

例如,如果英语-美国版本没有 MUI 包,则内容区域设置和关键字 (keyword) 区域设置均为 1033。 如果你有没有 MUI 包的德语版本,则内容区域设置和关键字 (keyword) 区域设置均为 1031 (gr-gr) 。 但是,如果你有带有罗马尼亚 MUI 包的英语版本,则内容区域设置为 2072 (ro) ,关键字 (keyword) 区域设置为 1033 (en-us) 。

使用属性和列

方法 说明
ISearchQueryHelper::get_QueryContentProperties/
ISearchQueryHelper::p ut_QueryContentProperties
获取/设置 CONTAINS 或 FREETEXT 子句) 中列出的搜索 (属性列的内容属性。
ISearchQueryHelper::get_QuerySelectColumns/
ISearchQueryHelper::p ut_QuerySelectColumns
获取/设置 SELECT 语句中请求的列 (或属性) 。 默认值为 System.ItemUrl 和 WHERE 子句中使用的属性。

 

项在属性存储中以行的形式表示。 每一行包含表示该项属性的列数。 并非所有项都具有给定属性的值。 例如,音频文件通常不包含 System.Property.FromName 属性的值,但可能包含有关 System.Music.Artist 的信息。

使用这些方法,可以使用逗号分隔、以 null 结尾的 Unicode 字符串访问或修改属性,该字符串指定属性存储的一个或多个列名:“System.Document.Author,System.Document.Title”。

使用查询词扩展

方法 说明
ISearchQueryHelper::get_QueryTermExpansion
ISearchQueryHelper::p ut_QueryTermExpansion
获取/设置搜索词扩展标志。

 

此方法允许使用野生卡字符扩展某些查询词,类似于正则表达式扩展。 前缀扩展 (fun/漏斗) 搜索具有相同前缀的单词。 如果未设置,则默认值为SEARCH_TERM_PREFIX_ALL。 SEARCH_TERM_EXPANSION 枚举支持的值如下所示:

  • SEARCH_TERM_PREFIX_ALL - 展开所有搜索词
  • SEARCH_TERM_NO_EXPANSION - 未展开搜索词

使用其他 ISearchQueryHelper 方法

ISearchQueryHelper 接口中的许多方法用于设置查询参数或定义返回的属性。

方法 说明
ISearchQueryHelper::get_ConnectionString
返回 OLE DB 连接字符串。 这是获取正确格式且正确的连接字符串的首选方法。
ISearchQueryHelper::get_QueryMaxResults
ISearchQueryHelper::p ut_QueryMaxResults
获取/设置查询 (返回的最大结果数,即 SELECT TOP n) 。 默认值为 -1,这意味着不会生成最大结果子句。
ISearchQueryHelper::get_QuerySorting
ISearchQueryHelper::p ut_QuerySorting
获取/设置查询结果集的排序顺序 (ORDER BY) 。 如果不存在 ORDER BY 子句,则以非确定性顺序返回结果。
ISearchQueryHelper::get_QuerySyntax
ISearchQueryHelper::p ut_QuerySyntax
获取/设置查询的语法:高级查询语法或自然查询语法。
ISearchQueryHelper::get_QueryWhereRestrictions
ISearchQueryHelper::p ut_QueryWhereRestrictions
获取/设置通过 WHERE 子句追加的限制。

 

以编程方式查询索引

使用 SQL 和 AQS 方法查询索引

使用 search-ms 协议查询索引

使用 Windows 搜索 SQL 语法查询索引

以编程方式使用高级查询语法