Устройство морфологических списков
Для хранения информации о взаимосвязи форм слова (без указаниях грамматических характеристик – рода, времени, числа, падежа и т.п.) используется набор морфологических списков – с типами eWordListType_MorphologyBaseForm и eWordListType_MorphologyInflectionForm
При этом сами списки структурно аналогичны спискам полнотекстового поиска, т.е. каждая запись такого списка имеет ссылки на несколько соответствующих им записей другого списка: например, слово из списка базовых форм будет ссылаться на одно или несколько слов списка производных, и наоборот. При этом роль полного набора базовых форм, на которые можно ссылаться, обычно выполняет обычный словарный список, а полный набор производных приходится составлять отдельно. Более детально с описанием и структурой списков FTS можно ознакомиться здесь.
Списки с морфологическими формами обычно используются для:
- подготовки запросов поиска и сортировки его результатов
- получения информации о базовых формах для отображения морфологических подсказок
Подготовка поисковых запросов
Для подготовки поисковых запросов (для поиска по шаблону и полнотекстового поиска) используются следующие функции:
/// Преобразует строку поиска, введенную пользователем, в расширенный запрос, использую морфологию встроенную в базу
ESldError PrepareQueryForFullTextSearch(const UInt16 *aText, CSldDictionary *aDict, Int32 aListIndex, SldU16String& aResultQuery, SldU16WordsArray * aMorphoForms = NULL);
/// Преобразует строку поиска, введенную пользователем, в расширенный запрос для поиска по шаблону, использую морфологию встроенную в базу.
ESldError PrepareQueryForWildCardSearch(const UInt16* aText, CSldDictionary* aDict, Int32 aListIndex, TExpressionBox* aExpressionBox);
/// Преобразует строку поиска, введенную пользователем, в расширенный запрос для полнотекстового поиска
ESldError PrepareQueryForSortingSearchResults(const UInt16* aText, CSldDictionary* aDict, UInt32 aLangCode, CSldVector<TSldMorphologyWordStruct>& aMorphologyForms);
На вход они принимают текст, введенный пользователем, а в качестве результата возвращают готовый поисковый запрос. При его использовании выдача поиска будет содержать морфологические формы слов, а в случае сортировки повысится релевантность результатов.
Получение морфологических форм
Для получения всех морфоформ используется:
ESldError GetMorphoForms(const UInt16 *aText, CSldDictionary *aDict, UInt32 aLangFrom, CSldVector<TSldMorphologyWordStruct> & aMorphologyForms, UInt32 aWithoutRequest, const EMorphoFormsType aType)
При этом последний аргумент позволяет отфильтровать выдачу, добавив в результаты только один из следующих типов форм:
/// Тип получаемых морфоформ
enum EMorphoFormsType
{
/// Все морфоформы
eMorphoAll = 0,
/// Только базовые формы
eMorphoBase,
/// Только производные формы
eMorphoDerivative
};
Сами элементы вектора результатов также содержат в себе тип морфоформы:
/// Перечисление, описывающее типы слов, получаемых из морфологии
enum ESldMorphologyWordTypeEnum
{
/// Базовая форма слова
eMorphologyWordTypeBase = 0,
/// Одна из словоформ
eMorphologyWordTypeWordform,
};
/// Структура для хранения слова, полученного из морфологии
typedef struct TSldMorphologyWordStruct
{
/// Слово
SldU16String MorphologyForm;
/// Тип слова
ESldMorphologyWordTypeEnum MorphologyFormType;
...
} TSldMorphologyWordStruct;