Я пытаюсь создать новый фильтр для моего собственного файла формата. На данный момент Windows Search использует новую библиотеку DLL и индексирует в соответствии с. Но настоящая причина создания этого фильтра - использовать его с SQL Server.
Я уже зарегистрирован в реестре окон. Например, когда я запускаю этот запрос
SELECT *
FROM sys.fulltext_document_types
Я вижу мой формат в списке:
.testestep 8C337B26-3E38-4F98-813B-FBA18BAB64F5 C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\Binn\FilterSample.dll`
Но когда я помещаю какой-то файл в папку для индексации, я получаю эту ошибку:
2019-01-09 11: 47: 04.74 spid45s Предупреждение. Не найден соответствующий фильтр при заполнении полнотекстового индекса для таблицы или индексированного представления '[FileSearchTest]. [Dbo]. [DocumentSemantics]' (таблица или индексированное представление). Идентификатор '1205579333', идентификатор базы данных '5'), значение полнотекстового ключа '/46099760921201.52005918538294.901627799/'. Некоторые столбцы строки не были проиндексированы.
2019-01-09 11: 47: 04.74 spid33s Информация: Полнотекстовое автоматическое заполнение завершено для табличного или индексированного представления '[FileSearchTest]. [Dbo]. [DocumentSemantics]' (идентификатор таблицы или индексированного представления '1205579333', идентификатор базы данных «5»). Количество обработанных документов: 1. Число ошибочных документов: 0. Количество документов, которые будут повторены: 0.
Я реализовал IPersistFile
, IPersistStream
и IFilter
, думаю, этого достаточно. Я попытался реализовать IPersistStorage
, но только с E_NOTIMPL
для проверки и безуспешно. Не существует так много информации о IFilter
для SQLServer, и я схожу с ума из-за этого.
Код для вставки чанка (созданного для проверки с помощью поиска Windows):
HRESULT CFilterSample::GetNextChunkValue(CChunkValue &chunkValue)
{
HRESULT hr = S_OK;
chunkValue.Clear();
CString myLine;
CString propertyValue;
int ndx = 0;
for(int i = 0; i < 10; i++)
{
myLine = ReadLine();
if (myLine.Find(_T("Title:")) >= 0)
{
//Found customer, lets save the value.
ndx = myLine.Find(_T(":"));
propertyValue = myLine.Mid(ndx + 1, 1000);
propertyValue = propertyValue.Trim();
chunkValue.SetTextValue(PKEY_Title, propertyValue);
return S_OK;
}
else if (myLine.Find(_T("Content":)) >= 0)
{
//Found customer, lets save the value.
ndx = myLine.Find(_T(":"));
propertyValue = myLine.Mid(ndx + 1, 1000);
propertyValue = propertyValue.Trim();
chunkValue.SetTextValue(PKEY_Search_Contents, propertyValue, CHUNK_TEXT);
return S_OK;
}
else if (myLine.Find(_T("Author:")) >= 0)
{
//Found customer, lets save the value.
ndx = myLine.Find(_T(":"));
propertyValue = myLine.Mid(ndx + 1, 1000);
propertyValue = propertyValue.Trim();
chunkValue.SetTextValue(PKEY_ItemAuthors, propertyValue);
return S_OK;
}
}
// if we get to here we are done with this document
return FILTER_E_END_OF_CHUNKS;
}
Для создания этой DLL я использовал пример IFilter с некоторыми изменениями по этой ссылке: https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/hh694268(v%3Doffice.14)
Есть разница для индексации на SQL Server?
Я использую SQL Server 2017 Express для тестирования.