Описание и структура списка

Как и другие списки слов, список полнотекста представляет из себя ассоциативный массив “ключ-связанные значения”, в котором перечислeны слова и указано в каких местах они встрeчаются, то есть слову соответствует массив идентификаторов записей списков, переводы которых содержат это слово.

Структура самих списков FTS основана на стандартной структуре списков словаря, разберем детали на примере:

<List>
    <article id="self_id1">
        <wl-name>go</wl-name>
        <id>entry_a</id>
        <id>entry_go</id>
        <id>entry_some</id>
    </article>
    <article id="self_id2">
        <wl-name>abandon</wl-name>
        <id>entry_abandon</id>
    </article>
<List>

В данном случае ключом является слово, встречающееся в тексте статей словаря (хранится в <wl-name>), а значениями (в тегах <id>) – идентификаторы записей, через которые можно получить доступ к нужной статье. Т.е. в приведенном примере можно считать, что слово “go” встречается в статьях с <id> “entry_a”, “entry_go” и “entry_some”, а слово “abandon” – только в статье с <id> “entry_abandon”.

Назначение вспомогательных (Auxiliary) списков

При создании полнотекстового поиска нужно учесть следующую особенность: id статей (в тегах <id>) могут быть из любого списка словаря. Делается это потому, что зачастую недостаточно сослаться просто на статью в словарном списке, т.к. она не содержит вспомогательной информации. Например, нам необходимо не только перейти в нужную статью, но и отскроллить окно перевода поближе к фразе, а словарный список никакой информации о скролле не содержит. В этом случае помимо полнотекстового индекса в статьях добавляются anchor-ы (метки) и создается еще один вспомогательный список с указанием идентификаторов этих меток в виде отдельного варианта написания (“Label”) для подмотки. При этом ссылки из полнотекстового индекса ведут на на вспомогательный, а уже он ссылается на словарный. Этот же список может хранить и часть контекста вокруг искомого слова (которую можно сразу показать в выдаче результатов поиска). В итоге для режима с этими вспомогательными списками была добавлена отдельная настройка (см. тег <LinkType> в файле проекта)

Использование морфологии

Если для языка слов списка полнотекстового поиска доступна морфологическая база, то как правило в список заносятся не сами слова, а их базовые формы. Т.е. при индексации контента если мы хотим добавить некоторое слово в список, то сначала нужно получить его базовую форму и добавлять по ней. Например, в тексте английской статьи “А” встретили слово “went” – получаем его базовую форму (“go”) и создаем запись вида:

<List>
    <article id="self_id1">
        <wl-name>go</wl-name> <!-- не "went", а "go" -->
        <id>entry_a</id>
        ...
    </article>
    ...
<List>

Делается это для того, чтобы расширить выдачу – если в итоге пользователь поищет “go”, то он сможет найти статьи с “went”. Более того, в процессе поиска в приложении также используется приведение к базовой форме и поэтому при запросе “gone” (который приложением конвертируется в “go” через морфологию) все также будут найдены статьи с вхождением “went”.

Как создается список полнотекстового поиска

При необходимости создания списка делается следующее:

  1. парсер проходит по нужным тегам в статье Х, получает из них фразы
  2. перед фразой в текст статьи добавляется метка (метаданные <Label>) с уникальным (в пределах статьи) идентификатором фразы
  3. каждая такая фраза разбивается на отдельные слова
  4. для каждого из слов получаем базовую форму из морфологии 
  5. в Aux список полнотекстового поиска добавляется отдельная запись под результат поиска с вариантами написания Show = Х, Phrase = {фраза из п.3}, Label = {метка из п.2}. Остальные варианты написания опциональны. В качестве <id> указывается entryId статьи Х
  6. в список полнотекстового поиска в запись для каждой базовой формы добавляется id записи из п.5

Таким образом получается, что несколько записей из списка полнотекста, соответствующие словам фразы, ссылаются на фразу-результат поиска из Aux-списка. Эта фраза в свою очередь ссылается на саму словарную статью и говорит, к какой ее части подмотаться для отображения.

Разметка списка FTS в файле проекта

В файле проекта данный список слов можно определить следующим образом:

<List id="FTS_1">
    <ListType>FullTextSearch</ListType>
    <isListSorted>YES</isListSorted>
    <ListFile>FTS_List.xml</ListFile>
    <LanguageCodeFrom>engl</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <FullTextSearchOptions>
        <LinkType>ListEntryId</LinkType>
        <ShiftType>SymbolsFromArticleBegin</ShiftType>
        <Priority>0</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>DirectList</AllowSourceListId>
    </FullTextSearchOptions>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    ...
</List>

Параметры, заданные в файле проекта

<LanguageCodeFrom>engl</LanguageCodeFrom>
<LanguageCodeTo>engl</LanguageCodeTo>

Задают язык, на котором ведется поиск (=слова какого языка содержатся в индексе)
Важно заметить, что эти параметры должны совпадать.

<ListType>FullTextSearch</ListType>

Устанавливается тип списка. Существуют следующие типы в зависимости от назначения списка:

  • FullTextSearch – общий тип для списков полнотекстового поиска. Используется, если не определен тип контента, по которому происходит поиск.
  • FullTextSearch_Headword – тип для списков полнотекстового поиска по заголовкам.
  • FullTextSearch_Content – тип для списков полнотекстового поиска по всему контенту статьи.
  • FullTextSearch_Translation – тип для списков полнотекстового поиска по переводам.
  • FullTextSearch_Example – тип для списков полнотекстового поиска по примерам.
  • FullTextSearch_Definition – тип для списков полнотекстового поиска по определениям.
  • FullTextSearch_Phrase – тип для списков полнотекстового поиска по выражениям/фразам.
<isListSorted>YES</isListSorted>

Список слов должен быть отсортированным, так как нужно иметь возможность искать в данном списке слов по тексту.

<ListFile>FTS_List.xml</ListFile>

Здесь указывается xml-файл списка слов полнотекстового поиска.

<isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>

Явно указываем списку слов, что на одно слово может приходится несколько переводов (= несколько тегов <id>), то есть слово может быть найдено в нескольких местах.

Каждый список слов полнотекстового поиска должен содержать раздел <FullTextSearchOptions>, в котором описываются его настройки:

<LinkType>ArticleId</LinkType>

Тип ссылок в списке слов. Необязательное поле. Определяет, идентификаторами чего является содержимое тегов <id> в файле списка слов FTS_List.xml. Возможны следующие значения:

  • ArticleId – записи списка слов полнотекстового поиска ссылаются на статьи (переводы). В нашем примере в начале статьи это означает, что слово "go" содержится в статьях с идентификаторами entry_a, entry_go, entry_some, а слово "abandon" содержится в статье с идентификатором entry_abandon. Если поле <LinkType> отсутствует в разделе <FullTextSearchOptions>, то данное значение ArticleId используется по умолчанию.
  • ListEntryId – записи списка слов полнотекстового поиска ссылаются на записи других списков слов, которые в свою очередь ссылаются на переводы этих слов. В нашем примере это будет означать, что слово "go" содержится в статье, на которую ссылаются записи списка с идентификаторами entry_a, entry_go, entry_some, а слово "abandon" содержится в статье, на которую ссылается запись с идентификатором entry_abandon.
<ShiftType>SymbolsFromArticleBegin</ShiftType>

Тип смещения внутри статьи, которое используется в тегах <id> в файле списка слов FTS_List.xml. Необязательное поле. Смещения могут применяться для указания того, в каком конкретном месте статьи содержится найденное слово. В поиске по заголовкам не используется. Возможны следующие значения:

  • None – cмещения не используются. В этом случае теги <id> в файле списка слов FTS_List.xml не должны содержать атрибута shift. Является значением по умолчанию.
  • SymbolsFromArticleBegin – величина смещения в атрибуте shift тега <id> является количеством символов от начала статьи до начала найденного слова.
<Priority>0</Priority>

Номер списка слов полнотекстового поиска среди других списков слов полнотекстового поиска. Обязательное поле. Поле должно содержать число от 0 до 255. Каждый список слов полнотекстового поиска в словаре должен иметь уникальное значение Priority.

<isListSuffixSearch>NO</isListSuffixSearch>

Флаг, указывающий, будет или нет ядром использоваться суффиксный поиск при поиске с помощью данного списка слов полнотекстового поиска. Необязательное поле. Возможны следующие значения.

  • NO – суффиксный поиск применяться не будет. Является значением по умолчанию. Это означает, что если мы ищем в нашем списке слов полнотекстового поиска слово «abandon», то мы найдем только слово «abandon» и получим в качестве результата поиска ссылки на идентификаторы переводов или других слов только для этого слова.
  • YES – будет применяться суффиксный поиск. Это означает, что если мы ищем в нашем списке слов полнотекстового поиска из примера слово «abandon», то мы найдем слово «abandon», а также слова «aban» и «aba» – окончания (суффиксы) у искомого слова будут отбрасываться для увеличения количества найденных слов. В качестве результата поиска мы получим ссылки на идентификаторы переводов или других слов для всех найденных слов.
<isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>

Флаг, указывающий, содержит или нет данный список слов полнотекстового поиска наряду с основными формами слова также и их словоформы. Необязательное поле. Значение этого поля влияет на возможную стратегию поиска введенного пользователем слова в оболочке. Возможны следующие значения.

  • NO – список слов не содержит формы своих слов. Является значением по умолчанию. В этом случае, если оболочка будет использовать специальную функцию подготовки поискового запроса PrepareQueryForFullTextSearch(), то наряду с введенным пользователем словом будут искаться также и его словоформы, получаемые с помощью морфологического модуля (если морфологический модуль используется). Это делается для того, чтобы независимо от того, в какой форме пользователь ввел слово для поиска, оно было найдено. Так если пользователь введет одну из форм слова “abandon” он получит ссылку на статью/запись списка с идентификатором entry_abandon.
  • YES – список слов содержит формы своих слов. В этом случае, если оболочка будет использовать специальную функцию подготовки поискового запроса PrepareQueryForFullTextSearch(), то будет искаться только введенное пользователем слово, потому что, в какой бы форме пользователь не ввел слово, эта словоформа теоретически присутствует в данном списке слов и будет найдена (на что и указывает данное значение флага).
<AllowSourceListId>

Необязательное поле. Раздел <FullTextSearchOptions> может содержать некоторое количество полей <AllowSourceListId>, в каждом из которых указывается идентификатор списка слов, на который данный список слов полнотекстового поиска может ссылаться. Для этого у списков слов словаря должны быть указаны уникальные среди всех списков слов идентификаторы. Идентификатор списка слов указывается в атрибуте id тега <List>. Список слов из примера имеет идентификатор "FTS_1", и может ссылаться на слова и переводы, которые используются в списке слов с идентификатором “DirectList”. В поле <AllowSourceListId> нельзя указывать идентификатор списка слов полнотекстового поиска. Если не указано ни одного допустимого идентификатора списка слов, на которые может ссылаться список слов полнотекстового поиска, то ему разрешается ссылаться на любой список слов, кроме списков слов полнотекстового поиска.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.