使用 ISearchQueryHelper 查询索引
可以使用 ISearchQueryHelper 接口来查询索引。 此接口作为 ISearchCatalogManager (和 ISearchCatalogManager2) 的帮助程序类实现,并通过调用 ISearchCatalogManager::GetQueryHelper 获取。 此接口允许你:
- 获取 OLE DB 连接字符串以连接到 Windows 搜索数据库。
- 将高级查询语法 (AQS) 用户查询转换为 Windows 搜索结构化查询语言 (SQL) 。
- 指定可在 SQL 中表示但不能在 AQS 中表示的查询限制。
本主题的组织方式如下:
- 使用 ISearchQueryHelper 入门
- 使用 GenerateSqlFromUserQuery 方法
- 使用区域设置标识符
- 使用属性和列
- 使用查询词扩展
- 使用其他 ISearchQueryHelper 方法
- 相关主题
使用 ISearchQueryHelper 入门
在开始使用 ISearchQueryHelper 接口以编程方式查询 Windows 搜索之前,应注意一些关键接口和方法。 概括而言,需要执行以下步骤:
实例化 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));
使用 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);
使用 ISearchCatalogManager::GetQueryHelper 获取 ISearchQueryHelper 的实例。
// Call ISearchCatalogManager::GetQueryHelper to get the ISearchQueryHelper interface ISearchQueryHelper* pQueryHelper; hr = pSearchCatalogManager->GetQueryHelper(&pQueryHelper);
拥有 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 子句追加的限制。 |
相关主题