Microsoft Desktop Search - СОДЕРЖИТ не возвращает результаты на Windows Server 2008
Я пытаюсь найти на удаленном файловом ресурсе (под управлением Windows Server 2008 R2) файлы, содержащие текст. Если я попробую это, все будет работать нормально:
SELECT System.FileName
FROM RemoteServer.SystemIndex
WHERE SCOPE='file://RemoteServer/FileShare'
и я получаю много результатов. Но как только я пытаюсь найти какой-то текст, я не получаю результатов:
SELECT System.FileName
FROM RemoteServer.SystemIndex
WHERE SCOPE='file://RemoteServer/FileShare'
AND CONTAINS('a')
если я попробую его на моей машине (Windows 7), он будет работать нормально:
SELECT FileName
FROM SystemIndex
WHERE CONTAINS('a')
Вот мой код C#, который я использую для поиска:
string connectionString = "Provider=Search.CollatorDSO;Extended Properties=\"Application=Windows\"";
using (OleDbConnection myOleDbConnection = new OleDbConnection(connectionString))
{
myOleDbConnection.Open();
using (OleDbCommand myOleDbCommand = new OleDbCommand(sql, myOleDbConnection))
{
using (myDataReader = myOleDbCommand.ExecuteReader())
{
if (!myDataReader.HasRows)
{
System.Console.WriteLine("Query returned 0 rows!");
}
else
{
// Process results here
}
}
}
}
Я пробовал следующее:
- Перестроил индекс
- Проверено, что папка "FileShare" была добавлена на сервере для индексации
- Проверил вкладку "Типы файлов", что отмечены правильные расширения, и что "Свойства индекса и содержимое файла" выбраны для этих расширений
- Перезапустил службу индексации
- Перезапустил сам сервер
но безрезультатно.
Любые другие предложения? Разочаровывает, так как я на 99% пути туда. Весь этот поиск на рабочем столе Windows, кажется, довольно не поддерживается, может быть, я должен это сделать и использовать что-то еще?
1 ответ
Попробуйте объявить переменную nvarchar для поискового слова.
DECLARE @SearchWord nvarchar(30) = 'a'
Затем измените ваш код на:
ВЫБЕРИТЕ FileName
ОТ SystemIndex
ГДЕ СОДЕРЖИТСЯ (@SearchWord)
Этот отрывок из TechNet содержит: см. TechNet
* содержит_поиск_условие * это nvarchar. Неявное преобразование происходит, когда в качестве входных данных используется другой символьный тип данных. В следующем примере переменная @SearchWord, которая определена как varchar(30), вызывает неявное преобразование в предикат CONTAINS.
Встречаюсь с той же проблемой. После нескольких дней сервальных мучений я обнаружил этот код, который может работать в Windows Server 2008 R2:
AND CONTAINS('keyword')
->
and System.Search.AutoSummary like '%keyword%'