3

場所がインデックス化されているかどうかを確認する方法は? Windows で場所をインデックス化する次のコードを見つけましたが、これは正常に動作しますが、インデックス化する前に、インデックス化されているかどうかを確認したいと考えています。

Uri path = new Uri(location);
string indexingPath = path.AbsoluteUri;

CSearchManager csm = new CSearchManager();
CSearchCrawlScopeManager manager =  csm.GetCatalog("SystemIndex").GetCrawlScopeManager();

manager.AddUserScopeRule(indexingPath, 1, 1, 0);
manager.SaveAll();

皆様、IncludedInCrawlScope を使用して、その場所がインデックス作成に含まれているかどうかを確認する方法を見つけました。

CSearchManager csm = new CSearchManager();
CSearchCrawlScopeManager manager = csm.GetCatalog("SystemIndex").GetCrawlScopeManager();

if (manager.IncludedInCrawlScope(indexingPath) == 0)
{
    manager.AddUserScopeRule(indexingPath, 1, 1, 0);
    manager.SaveAll();
}

ただし、インデックス作成が完了しているかどうかではなく、インデックス作成のために追加されているかどうかのみをチェックします。

4

2 に答える 2

0

私は同様のニーズに遭遇し、これが私が思いついたものです. 私の場合、ドキュメント管理システムに送信される特定のファイル拡張子があります。

System.IO を使用して、リストから拡張子を含むディレクトリ内のファイルのリストを取得する 2 つの方法があります。

 public IEnumerable<string> DirectoryScan(string directory)
    {

        List<string> extensions = new List<string>
        {
        "docx","xlsx","pptx","docm","xlsm","pptm","dotx","xltx","xlw","potx","ppsx","ppsm","doc","xls","ppt","doct","xlt","xlm","pot","pps"
        };
        IEnumerable<string> myFiles =
            Directory.GetFiles(directory, "*", SearchOption.AllDirectories)
                .Where(s => extensions.Any(s.EndsWith))
                .ToList();
        return myFiles;
    }`

2 番目の方法では、Windows インデックス検索 Microsoft.Search.Interop を使用します。

 public IEnumerable<string> QueryWindowsDesktopSearch(string directory)
    {

        List<string> extensions = new List<string>
        { "docx","xlsx","pptx","docm","xlsm","pptm","dotx","xltx","xlw","potx","ppsx","ppsm","doc","xls","ppt","doct","xlt","xlm","pot","pps"};

        string userQuery = "*";
        Boolean fShowQuery = true;
        List<string> list = new List<string>();
        CSearchManager manager = new CSearchManager();
        CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
        CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper();
        queryHelper.QueryWhereRestrictions = string.Format("AND (\"SCOPE\" = 'file:{0}')", directory);

        if (extensions != null)
        {
            queryHelper.QueryWhereRestrictions += " AND Contains(System.ItemType,'";
            bool fFirst = true;
            foreach (string ext in extensions)
            {
                if (!fFirst)
                {
                    queryHelper.QueryWhereRestrictions += " OR ";
                }
                queryHelper.QueryWhereRestrictions += "\"" + ext + "\"";
                fFirst = false;
            }
            queryHelper.QueryWhereRestrictions += "') ";
        }

        string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery);

        using (OleDbConnection connection = new OleDbConnection(queryHelper.ConnectionString))
        {
            using (OleDbCommand command = new OleDbCommand(sqlQuery, connection))
            {
                connection.Open();
                OleDbDataReader dataReader = command.ExecuteReader();

                while (dataReader.Read())
                {
                    var file = dataReader.GetString(0);
                    if (file != null)
                    {
                        list.Add(file.Replace("file:", ""));
                    }
                }
            }
        }
        return list;
    }

これらのメソッドは両方とも、2 つの結果を取得して比較し、2 つのリストが一致するかどうかを示すブール値を返す別のメソッドから呼び出します。それらが一致しない場合、フォルダは完全にインデックス化されていません。

インデックスが作成されていないフォルダーで QueryWindowsDesktopSearch を呼び出すと、ゼロ ファイルが返されます。これは、フォルダーがインデックスにないことを示すものとして使用できますが、ファイルがインデックスに追加されている可能性がありますが、ファイルのインデックス作成は停止しています。

このようなものを呼び出すことでステータスを確認できます

 CSearchManager manager = new CSearchManager();
 CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
 _CatalogPausedReason pReason;
 _CatalogStatus pStatus;
 catalogManager.GetCatalogStatus(out pStatus, out pReason);

pStatus = CATALOG_STATUS_PAUSED および pReason = CATALOG_PAUSED_REASON_USER_ACTIVE のようなものが返される場合があります。

インデックスが実行されていないことがわかります。あなたができる別のことは、次のように呼び出すことです

int incrementalCount, notificationQueue, highPriorityQueue;
catalogManager.NumberOfItemsToIndex(out incrementalCount, out notificationQueue, out highPriorityQueue);

これは、SystemIndex 全体がインデックス作成のためにキューに入れているファイルの数をリストする in plIncrementalCount 値を返します。

于 2015-03-27T22:18:23.250 に答える
-1

ドキュメント管理システムからこの実装を確認します。

https://code.google.com/p/olakedms/source/browse/SearchEngine/CSearchDAL.cs?r=171

于 2014-05-26T12:45:28.723 に答える