Основой для реализации поиска в словаре служат списки, содержащие полнотекстовый индекс, где хранятся слова и соответствующие им идентификаторы статей, в которых эти слова встречаются. Существует три версии полнотекстового поиска, но структурных различий в них нет (приоритетной версией считается 3-я).

Рассмотрим какие типы полнотекстового поиска существуют на примере англо-русского словаря.

1-я версия – “Заголовки + контент”

В простейшем случае для двунаправленного словаря разработчик базы генерирует 4 списка полнотекстового поиска.

  • первый – для поиска по заголовкам прямого направления словаря.
  • второй – для поиска по заголовкам парного направления словаря.
  • третий – для поиска слов языка прямого направления (в нашем случае английских слов) в содержимом статей обоих направлений.
  • четвертый – для поиска слов парного языка (русских слов) в содержимом статей обоих направлений.

Пример файла проекта для такого вида поиска приведен ниже:

<List id="FTSL_0">
        <ListType>FullTextSearch_Headword</ListType>
        <FullTextSearchOptions>
            <LinkType>ArticleId</LinkType>
            <ShiftType>None</ShiftType>
            <Priority>0</Priority>
            <isListSuffixSearch>NO</isListSuffixSearch>
            <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
            <AllowSourceListId>0</AllowSourceListId>
        </FullTextSearchOptions>
        <isListSorted>YES</isListSorted>
        <isListHasHierarchy>NO</isListHasHierarchy>
        <isListHasIcons>NO</isListHasIcons>
        <isListHasSounds>NO</isListHasSounds>
        <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
        <LanguageCodeFrom>engl</LanguageCodeFrom>
        <LanguageCodeTo>engl</LanguageCodeTo>
        <ListFile>Direct_Headwords.xml</ListFile>
        <CompressionMethod>CharCount</CompressionMethod>
        <Strings Language="engl">
            ...
        </Strings>
    </List>
    <List id="FTSL_1">
        <ListType>FullTextSearch_Headword</ListType>
        <FullTextSearchOptions>
            <LinkType>ArticleId</LinkType>
            <ShiftType>None</ShiftType>
            <Priority>1</Priority>
            <isListSuffixSearch>NO</isListSuffixSearch>
            <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
            <AllowSourceListId>1</AllowSourceListId>
        </FullTextSearchOptions>
        <isListSorted>YES</isListSorted>
        <isListHasHierarchy>NO</isListHasHierarchy>
        <isListHasIcons>NO</isListHasIcons>
        <isListHasSounds>NO</isListHasSounds>
        <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
        <LanguageCodeFrom>russ</LanguageCodeFrom>
        <LanguageCodeTo>russ</LanguageCodeTo>
        <ListFile>Pair_Headwords.xml</ListFile>
        <CompressionMethod>CharCount</CompressionMethod>
        <Strings Language="engl">
            ...
        </Strings>
    </List>
    <List id="FTSL_2">
        <ListType>FullTextSearch_Content</ListType>
        <FullTextSearchOptions>
            <LinkType>ArticleId</LinkType>
            <ShiftType>None</ShiftType>
            <Priority>2</Priority>
            <isListSuffixSearch>NO</isListSuffixSearch>
            <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
            <AllowSourceListId>0</AllowSourceListId>
            <AllowSourceListId>1</AllowSourceListId>
        </FullTextSearchOptions>
        <isListSorted>YES</isListSorted>
        <isListHasHierarchy>NO</isListHasHierarchy>
        <isListHasIcons>NO</isListHasIcons>
        <isListHasSounds>NO</isListHasSounds>
        <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
        <LanguageCodeFrom>engl</LanguageCodeFrom>
        <LanguageCodeTo>engl</LanguageCodeTo>
        <ListFile>Direct_AllContent.xml</ListFile>
        <CompressionMethod>CharCount</CompressionMethod>
        <Strings Language="engl">
            ...
        </Strings>
    </List>
    <List id="FTSL_3">
        <ListType>FullTextSearch_Content</ListType>
        <FullTextSearchOptions>
            <LinkType>ArticleId</LinkType>
            <ShiftType>None</ShiftType>
            <Priority>3</Priority>
            <isListSuffixSearch>NO</isListSuffixSearch>
            <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
            <AllowSourceListId>1</AllowSourceListId>
            <AllowSourceListId>0</AllowSourceListId>
        </FullTextSearchOptions>
        <isListSorted>YES</isListSorted>
        <isListHasHierarchy>NO</isListHasHierarchy>
        <isListHasIcons>NO</isListHasIcons>
        <isListHasSounds>NO</isListHasSounds>
        <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
        <LanguageCodeFrom>russ</LanguageCodeFrom>
        <LanguageCodeTo>russ</LanguageCodeTo>
        <ListFile>Pair_AllContent.xml</ListFile>
        <CompressionMethod>CharCount</CompressionMethod>
        <Strings Language="engl">
            ...
        </Strings>
    </List>

Заметим, элементы списков ссылаются на статьи словаря. Это видно по параметрам <LinkType>ArticleId</LinkType>

Очевидно, что в случае однонаправленного словаря нужно генерировать 2 списка поиска. Описание параметров списка полнотекстового поиска приведено здесь.

2-я версия – “Заголовки + разбитый по направлениям контент”

Аналогичен первому типу, но этом случае для двунаправленного словаря генерируется 6 списков полнотекстового поиска (для однонаправленного 3).

  • первый – для поиска по заголовкам прямого направления словаря.
  • второй – для поиска по заголовкам парного направления словаря.
  • третий – для поиска слов языка прямого направления (английских слов) в содержимом статей прямого направления (англо-русского).
  • четвертый – для поиска слов парного языка (русских слов) в содержимом статей прямого направления.
  • пятый – для поиска слов языка прямого навправления (английских слов) в содержимом статей парного направления (русского-английского)
  • шестой – для поиска слов парного языка (русских слов) в содержимом статей парного направления

Приведем пример файла проекта:

<List id="FTSL_0">
    <ListType>FullTextSearch_Headword</ListType>
    <FullTextSearchOptions>
        <LinkType>ArticleId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>0</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>0</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>engl</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <ListFile>Direct_Headwords.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
        ...
    </Strings>
</List>
<List id="FTSL_1">
    <ListType>FullTextSearch_Headword</ListType>
    <FullTextSearchOptions>
        <LinkType>ArticleId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>1</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>1</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>russ</LanguageCodeFrom>
    <LanguageCodeTo>russ</LanguageCodeTo>
    <ListFile>Pair_Headwords.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
        ...
    </Strings>
</List>
<List id="FTSL_2">
    <ListType>FullTextSearch_Content</ListType>
    <FullTextSearchOptions>
        <LinkType>ArticleId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>2</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>0</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>engl</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <ListFile>Direct_DirectContent.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
        ...
    </Strings>
</List>
<List id="FTSL_3">
    <ListType>FullTextSearch_Content</ListType>
    <FullTextSearchOptions>
        <LinkType>ArticleId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>3</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>0</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>russ</LanguageCodeFrom>
    <LanguageCodeTo>russ</LanguageCodeTo>
    <ListFile>Pair_DirectContent.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
        ...
    </Strings>
</List>
<List id="FTSL_4">
    <ListType>FullTextSearch_Content</ListType>
    <FullTextSearchOptions>
        <LinkType>ArticleId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>2</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>1</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>engl</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <ListFile>Direct_PairContent.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
        ...
    </Strings>
</List>
<List id="FTSL_5">
    <ListType>FullTextSearch_Content</ListType>
    <FullTextSearchOptions>
        <LinkType>ArticleId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>3</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>1</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>russ</LanguageCodeFrom>
    <LanguageCodeTo>russ</LanguageCodeTo>
    <ListFile>Pair_PairContent.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
        ...
    </Strings>
</List>

Обратите внимание, как проставлены параметры LangCodeFrom и LangCodeTo. Напомним, что эти параметры задают язык, на котором осуществляется поиск, и должны совпадать.

3-я версия “Заголовки + разбитый по направлениям и содержимому контент”

Принципиальное отличие этого типа полнотекстового поиска от двух предыдущих в том, что каждый элемент списка указывает не на статью, а на промежуточный список, который содержит избранные фразы, примеры и т.п., содержащиеся в статье. Этот список имеет тип FullTextAuxiliary

Screenshot_687.png

Тогда часть Auxiliary-списка с английскими примерами из этой статьи имеет следующий вид:

<List>
    ...
    <article id="EX_...1">
        <wl-name>neither</wl-name>
        <wl-name>neither of us can give an example</wl-name>
        <wl-name>fts_1</wl-name>
        <id>list_id_neither</id>
    </article>
    <article id="EX_...2">
        <wl-name>neither</wl-name>
        <wl-name>neither answer was true</wl-name>
        <wl-name>fts_2</wl-name>
        <id>list_id_neither</id>
    </article>
    ...
</List>

Как видно, у каждого элемента в списке имеются три варианта написания:

  • в первом варианте с типом Show мы задаем заголовок статьи в которой содержится пример
  • второй вариант с типом Phrase содержит сам пример
  • в третьем варианте указываем метку (тип Label) в статье, с помощью которой можно осуществить быструю подмотку к нужному нам примеру. Метки должны быть уникальными в пределах одной статьи. То есть помимо формирования списков полнотекстового поиска разработчик словарной базы должен следить за присутствием необходимых меток в статье (см. label).

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

<List id="FTSL_HIDDEN_0">
        <ListType>FullTextAuxiliary</ListType>
        <isListSorted>YES</isListSorted>
        <isListHasHierarchy>NO</isListHasHierarchy>
        <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
        <LanguageCodeFrom>engl</LanguageCodeFrom>
        <LanguageCodeTo>russ</LanguageCodeTo>
        <ListFile>Hidden_Direct_DirectExample.xml</ListFile>
        <CompressionMethod>CharCount</CompressionMethod>
        <isListHasIcons>NO</isListHasIcons>
        <isListHasSounds>NO</isListHasSounds>
        <VariantProperty>
            <Number>0</Number>
            <Type>Show</Type>
            <LanguageCode>engl</LanguageCode>
        </VariantProperty>
        <VariantProperty>
            <Number>1</Number>
            <Type>Phrase</Type>
            <LanguageCode>engl</LanguageCode>
        </VariantProperty>
        <VariantProperty>
            <Number>2</Number>
            <Type>Label</Type>
            <LanguageCode>engl</LanguageCode>
        </VariantProperty>
 
        <Strings Language="engl">
            ...
        </Strings>
    </List>

Параметры <LanguageCodeFrom><LanguageCodeTo> в отличае от списка с полнотекстовыми индексами могут быть разными и должны соотвествовать языкам направления. Так в примере выше наш список содержит примеры из англо-русского направления. Поэтому в свойствах проекта указываем:

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

Следует придерживаться именно такого порядка следования в вариантах написания (Заголовок – Фраза – Метка).

На основании полученных примеров генерируется список полнотекстового поиска, где в качестве индексов указываются id элементов FullTextAuxiliary-списка, во фразах которых встречаются искомые слова. Фрагмент этого списка (c учетом морфологии) выглядит так:

<List>
    ...
    <article id="FTS_...1">
        <wl-name>go</wl-name>
        <id>EX_...1</id>
    </article>
    <article id="FTS_...2">
        <wl-name>be</wl-name>
        <id>EX_...1</id>
        <id>EX_...3</id>
    </article>
 
    ...
</List>

Так, слово “go” присутствует в первом примере, слово “be” в лице его производных форм “shall” и “is” в первом и третьем примере нашей статьи. В файле проекта список представлен следующими настройками:

<List id="FTSL_0">
    <ListType>FullTextSearch_Example</ListType>
    <FullTextSearchOptions>
        <LinkType>ListEntryId</LinkType>
        <ShiftType>None</ShiftType>
        <Priority>0</Priority>
        <isListSuffixSearch>NO</isListSuffixSearch>
        <isListFullMorphologyWordForms>NO</isListFullMorphologyWordForms>
        <AllowSourceListId>1</AllowSourceListId>
    </FullTextSearchOptions>
    <isListSorted>YES</isListSorted>
    <isListHasHierarchy>NO</isListHasHierarchy>
    <isListHasIcons>NO</isListHasIcons>
    <isListHasSounds>NO</isListHasSounds>
    <isListHasNumberOfArticlesPerItem>YES</isListHasNumberOfArticlesPerItem>
    <LanguageCodeFrom>engl</LanguageCodeFrom>
    <LanguageCodeTo>engl</LanguageCodeTo>
    <ListFile>524D.ListFullTextSearch_Pair_Headwords.xml</ListFile>
    <CompressionMethod>CharCount</CompressionMethod>
    <Strings Language="engl">
 
    </Strings>
</List>

Как видим, параметр LinkType в этом случае не ArticleId, а ListEntryId. Тип списка полнотекстового поиска (FullTextSearch_Example) указывает, что поиск происходит по примерам.

По количеству списков полнотекстового поиска данный тип полностью идентичен второму типу, но их может быть и больше, в связи с тем, что разработчик базы может сгенерировать отдельные списки для разного типа содержимого одной и той же статьи (фразы, примеры, коментарии, определения и т.п.).

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