Windows Search のSQL文にSystem.ItemUrlを指定すると、検索処理に失敗する

こんにちは、Platform SDK (Windows SDK) サポートチームです。
アプリケーションから Windows Search 機能を利用してファイルの検索を行った場合、内部的なエラーにより検索結果が得られない現象についてご案内します。

現象
Windows 10 1703 (Creators Update) および Windows 10 1709 (Fall Creators Update) 上で OS の Windows Search 機能を利用してファイル検索を行い、結果としてファイルの URL (file:///c:/mydir/bar/hello.txt 等) を取得しようとすると、検索に失敗します。

たとえば、アプリケーションから以下のように SELECT 文に System.ItemUrl を指定した場合、hr = cCommand.Open(cSession, pszSQL); が DB_E_ERRORSOCCURRED エラーを返して失敗します。

 #include <atldbcli.h>

CDataSource cDataSource;

hr = cDataSource.OpenFromInitializationString(L"provider=Search.CollatorDSO.1;EXTENDED PROPERTIES=\"Application=Windows\"");
CString pszSQL = “SELECT System.ItemUrl FROM MachineName.SystemIndex WHERE SCOPE='file://MachineName/<path>'”
if (SUCCEEDED(hr))
{
     CSession cSession;
     hr = cSession.Open(cDataSource);
    if (SUCCEEDED(hr))
     {
         CCommand<CDynamicAccessor, CRowset> cCommand;
         hr = cCommand.Open(cSession, pszSQL);
        if (SUCCEEDED(hr))
         {
             for (hr = cCommand.MoveFirst(); S_OK == hr; hr = cCommand.MoveNext())
             {
                 for (DBORDINAL i = 1; i <= cCommand.GetColumnCount(); i++)
                 {
                     PCWSTR pszName = cCommand.GetColumnName(i);
                     // do something with the column here
                 }
             }
             cCommand.Close();
         }
     }
}

原因
この問題は Windows Search SQL の SELECT 文に System.ItemUrl が指定されている場合、検索処理が DB_E_ERRORSOCCURREDエラーで失敗することが原因で発生します。これは内部的なロジックの問題によりエラーが発生しており、製品の不具合であることを確認しています。

回避策
SELECT 文に System.ItemUrl が指定されている場合、検索が失敗するので、この値を指定しないでください。検索結果としてファイルパス (c:/mydir/bar/hello.txt 等) が必要な場合は、System.ItemPathDisplay を代替として利用いただけます。URL として検索結果のパスを扱いたい場合は System.ItemPathDisplay の結果に独自に file スキーマを追加していただき、プログラム的に回避いただく方法があります。

状況
この問題は次期Windowsに修正が行われる予定です。

参考情報

Windows Search 機能と、その中の SQL クエリの利用方法に関する概要については、以下を参照ください。

Windows Search

https://msdn.microsoft.com/en-us/library/windows/desktop/ff628790(v=vs.85).aspx

Querying the Index with Windows Search SQL Syntax

https://msdn.microsoft.com/en-us/library/windows/desktop/bb231256(v=vs.85).aspx

また、System.ItemUrl や System.ItemPathDisplay など、紹介したシステム プロパティの詳細と Windows Search  との関係については、以下を参照ください。

Property System Overview

https://msdn.microsoft.com/en-us/library/windows/desktop/ff728871(v=vs.85).aspx

Windows Properties

https://msdn.microsoft.com/en-us/library/windows/desktop/dd561977(v=vs.85).aspx