当 SQL 查询具有多个单词字符串到 W10 桌面搜索索引时出现异常

Exception when SQL query has multiple word string to W10 desktop search index

提问人:Dude named Ben 提问时间:2/8/2023 更新时间:2/8/2023 访问量:62

问:

我整理了一个基本的 Powershell 脚本来查询 W10 的 Windows 桌面搜索 (WDS) 索引。这是相关的位,

$query = "
    SELECT System.DateModified, System.ItemPathDisplay 
    FROM SystemIndex 
    WHERE CONTAINS(System.Search.Contents, '$($text)')
"

$objConnection = New-Object -ComObject adodb.connection
$objrecordset = New-Object -ComObject adodb.recordset

$objrecordset.CursorLocation = 3

$objconnection.open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")

$objrecordset.open($query, $objConnection, $adOpenStatic)

到目前为止,我的测试一直使用单个单词,一切正常。但是当我开始使用两个词时,它因以下错误而分崩离析,

Searching for 'and then'...

SELECT System.DateModified, System.ItemPathDisplay 
FROM SystemIndex 
WHERE CONTAINS(System.Search.Contents, 'and then')

Exception from HRESULT: 0x80040E14
At D:\searchSystemIndex.ps1:72 char:1
+ $objrecordset.open($query, $objConnection, $adOpenStatic)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

使用资源管理器查询索引工作正常。content:"and then"

有什么想法吗?

SQL PowerShell 异常 WDS

评论

1赞 Bee_Riii 2/8/2023
尝试将“然后”更改为“然后”

答:

0赞 mclayton 2/8/2023 #1

根据 Windows 搜索 SQL 语法的文档和 CONTAINS 谓词中的示例,如果要搜索包含“多个单词或包含空格”的文本短语,则需要在查询中引用该短语:

类型: 短语

说明:包含多个字词或包含的空格。

例子

...WHERE CONTAINS('"computer software"')

因此,在您的示例中,您可能需要:

$text = "and then"

$query = "
    SELECT System.DateModified, System.ItemPathDisplay 
    FROM SystemIndex 
    WHERE CONTAINS(System.Search.Contents, '`"$($text)`"')
"
#                                           ^^        ^^ 
#                                           quoted search phrase

(请注意,引号以反引号为前缀,否则引号将终止整个查询字符串。

如果您不是在寻找确切的短语“然后”,而只想要包含“and”和“then”的结果,那么看起来您需要执行如下操作:

类型:Boolean

说明:使用布尔运算符 AND、OR 或 NOT 组合的单词、短语和通配符字符串。 将布尔项用双引号括起来。

例:

...WHERE CONTAINS('"computer monitor" AND "software program" AND "install component"')

...WHERE CONTAINS(' "computer" AND "software" AND "install" ' )

$query = "
    SELECT System.DateModified, System.ItemPathDisplay 
    FROM SystemIndex 
    WHERE CONTAINS(System.Search.Contents, '`"and`" AND `"then`"')
#                                          ^^^^^^^^^^^^^^^^^^^^^^
#                                          multiple independent words
"

评论

0赞 Dude named Ben 2/8/2023
真的很棒。MS 文档的链接对于所有其他对我有用的搜索方式特别有用。
0赞 mclayton 2/8/2023
@DudenamedBen - NPYW。另外,我刚刚意识到“CONTAINS 谓词”链接已损坏 - 它现在已修复......