Реализация IFilter в полнотекстовом поиске SQL Server - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать новый фильтр для моего собственного файла формата. На данный момент 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`

1]

Но когда я помещаю какой-то файл в папку для индексации, я получаю эту ошибку:

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 для тестирования.

...