Основой для реализации поиска в словаре служат списки, содержащие полнотекстовый индекс, где хранятся слова и соответствующие им идентификаторы статей, в которых эти слова встречаются. Существует три версии полнотекстового поиска, но структурных различий в них нет (приоритетной версией считается 3-я).
Рассмотрим какие типы полнотекстового поиска существуют на примере англо-русского словаря.
- 1-я версия – “Заголовки + контент”
- 2-я версия – “Заголовки + разбитый по направлениям контент”
- 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
Тогда часть 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
) указывает, что поиск происходит по примерам.
По количеству списков полнотекстового поиска данный тип полностью идентичен второму типу, но их может быть и больше, в связи с тем, что разработчик базы может сгенерировать отдельные списки для разного типа содержимого одной и той же статьи (фразы, примеры, коментарии, определения и т.п.).