Глава 7. Поддержка языков

Содержание
7.1. Кодировки
7.2. Создание многоязычных страниц поиска
7.3. Сегментеры фраз японского, тайского, корейского и китайского языков
7.4. Поддержка мультиязычных веб серверов

7.1. Кодировки

7.1.1. Поддерживаемые кодировки

DataparkSearch поддерживает почти все популярные в современном Internet однобайтные и многобайтные кодировки, включая корейский euc-kr, китайские Big5, gbk и gb2312, японские shift-jis, euc-jp и iso-2022-jp, а так же Unicode UTF-8. Это позволяет индексировать документы на более чем 650-ти языках мира, предусмотренных в Unicode.

Внимание! Из-за большого объема перекодировочных таблиц, приводящего к увеличению размера исполняемых файлов, поддержка многобайтных кодировок не компилируется по-умолчанию. Смотрите параметры configure, как активизировать поддержку этих кодировок при компиляции.

Таблица 7-1. Кодировки и их языковые группы

>ГруппаКодировки
Arabic cp864, ISO-8859-6, MacArabic, windows-1256
Armenian armscii-8
Baltic cp775, ISO-8859-13, ISO-8859-4, windows-1257
Celtic ISO-8859-14
Central European cp852, ISO-8859-16, ISO-8859-2, MacCE, MacCroatian, MacRomania, windows-1250
Chinese Simplified GB2312, GBK
Chinese Traditional Big5, Big5-HKSCS, cp950, GB-18030
Cyrillic cp855, cp866, cp866u, ISO-8859-5, KOI-7, KOI8-R, KOI8-U, MacCyrillic, windows-1251
Georgian geostd8
Greek cp869, cp875, ISO-8859-7, MacGreek, windows-1253
Hebrew cp862, ISO-8859-8, MacHebrew, windows-1255
Icelandic cp861, MacIceland
Indian MacGujarati, tscii
Iranian ISIRI3342
Japanese EUC-JP, ISO-2022-JP, Shift_JIS
Korean EUC-KR
Lao cp1133
Nordic cp865, ISO-8859-10
South Eur ISO-8859-3
Tajik KOI8-T
Thai cp874, ISO-8859-11, MacThai
Turkish cp1026, cp857, ISO-8859-9, MacTurkish, windows-1254
Unicode sys-int, UTF-16BE, UTF-16LE, UTF-8
Vietnamese VISCII, windows-1258
Western cp437, cp500, cp850, cp860, cp863, IBM037, ISO-8859-1, ISO-8859-15, MacRoman, US-ASCII, windows-1252

7.1.2. Разные названия кодировок

Каждая кодировка имеет модет иметь несколько различных вариантов названия. Например, iso-8859-2, iso8859-2, latin2 - названия одной и той же кодировки. DataparkSearch понимает следующие варианты названий кодировок:

Таблица 7-2. Синонимы наименований кодировок

armscii-8 armscii-8, armscii8
Big5 big-5, big-five, big5, bigfive, cn-big5, csbig5
Big5-HKSCS big5-hkscs, big5_hkscs, big5hk, hkscs
cp1026 1026, cp-1026, cp1026, ibm1026
cp1133 1133, cp-1133, cp1133, ibm1133
cp437 437, cp437, ibm437
cp500 500, cp500, ibm500
cp775 775, cp775, ibm775
cp850 850, cp850, cspc850multilingual, ibm850
cp852 852, cp852, ibm852
cp855 855, cp855, ibm855
cp857 857, cp857, ibm857
cp860 860, cp860, ibm860
cp861 861, cp861, ibm861
cp862 862, cp862, ibm862
cp863 863, cp863, ibm863
cp864 864, cp864, ibm864
cp865 865, cp865, ibm865
cp866 866, cp866, csibm866, ibm866
cp866u 866u, cp866u
cp869 869, cp869, csibm869, ibm869
cp874 874, cp874, cs874, ibm874, windows-874
cp875 875, cp875, ibm875, windows-875
cp950 950, cp950, windows-950
EUC-JP cseucjp, euc-jp, euc_jp, eucjp, ujis, x-euc-jp
EUC-KR cseuckr, euc-kr, euc_kr, euckr
GB-18030 gb-18030, gb18030
GB2312 chinese, cn-gb, csgb2312, csiso58gb231280, euc-cn, euc_cn, euccn, gb2312, gb_2312-80, iso-ir-58
GBK cp936, gbk, windows-936
geostd8 geo8-gov, geostd8
IBM037 037, cp037, csibm037, ibm037
ISIRI3342 isiri-3342, isiri3342
ISO-2022-JP csiso2022jp, iso-2022-jp
ISO-8859-1 cp819, csisolatin1, ibm819, iso-8859-1, iso-ir-100, iso8859-1, iso_8859-1, iso_8859-1:1987, l1, latin1
ISO-8859-10 csisolatin6, iso-8859-10, iso-ir-157, iso8859-10, iso_8859-10, iso_8859-10:1992, l6, latin6
ISO-8859-11 iso-8859-11, iso8859-11, iso_8859-11, iso_8859-11:1992, tactis, thai, tis-620, tis620
ISO-8859-13 iso-8859-13, iso-ir-179, iso8859-13, iso_8859-13, l7, latin7
ISO-8859-14 iso-8859-14, iso-ir-199, iso8859-14, iso_8859-14, iso_8859-14:1998, l8, latin8
ISO-8859-15 iso-8859-15, iso-ir-203, iso8859-15, iso_8859-15, iso_8859-15:1998, l9, latin0, latin9
ISO-8859-16 iso-8859-16, iso-ir-226, iso8859-16, iso_8859-16, iso_8859-16:2000
ISO-8859-2 csisolatin2, iso-8859-2, iso-ir-101, iso8859-2, iso_8859-2, iso_8859-2:1987, l2, latin2
ISO-8859-3 csisolatin3, iso-8859-3, iso-ir-109, iso8859-3, iso_8859-3, iso_8859-3:1988, l3, latin3
ISO-8859-4 csisolatin4, iso-8859-4, iso-ir-110, iso8859-4, iso_8859-4, iso_8859-4:1988, l4, latin4
ISO-8859-5 csisolatincyrillic, cyrillic, iso-8859-5, iso-ir-144, iso8859-5, iso_8859-5, iso_8859-5:1988
ISO-8859-6 arabic, asmo-708, csisolatinarabic, ecma-114, iso-8859-6, iso-ir-127, iso8859-6, iso_8859-6, iso_8859-6:1987
ISO-8859-7 csisolatingreek, ecma-118, elot_928, greek, greek8, iso-8859-7, iso-ir-126, iso8859-7, iso_8859-7, iso_8859-7:1987
ISO-8859-8 csisolatinhebrew, hebrew, iso-8859-8, iso-ir-138, iso8859-8, iso_8859-8, iso_8859-8:1988
ISO-8859-9 csisolatin5, iso-8859-9, iso-ir-148, iso8859-9, iso_8859-9, iso_8859-9:1989, l5, latin5
KOI-7 iso-ir-37, koi-7, koi7
KOI8-R cskoi8r, koi8-r, koi8r
KOI8-T koi8-t, koi8t
KOI8-U koi8-u, koi8u
MacArabic macarabic
MacCE cmac, macce, maccentraleurope, x-mac-ce
MacCroatian maccroation
MacCyrillic maccyrillic, x-mac-cyrillic
MacGreek macgreek
MacGujarati macgujarati
MacHebrew machebrew
MacIceland macisland
MacRoman csmacintosh, mac, macintosh, macroman
MacRomania macromania
MacThai macthai
MacTurkish macturkish
Shift_JIS csshiftjis, ms_kanji, s-jis, shift-jis, shift_jis, sjis, x-sjis
sys-int sys-int
tscii tscii
US-ASCII ansi_x3.4-1968, ascii, cp367, csascii, ibm367, iso-ir-6, iso646-us, iso_646.irv:1991, us, us-ascii
UTF-16BE utf-16, utf-16be, utf16, utf16be
UTF-16LE utf-16le, utf16le
UTF-8 utf-8, utf8
VISCII csviscii, viscii, viscii1.1-1
windows-1250 cp-1250, cp1250, ms-ee, windows-1250
windows-1251 cp-1251, cp1251, ms-cyr, ms-cyrl, win-1251, win1251, windows-1251
windows-1252 cp-1252, cp1252, ms-ansi, windows-1252
windows-1253 cp-1253, cp1253, ms-greek, windows-1253
windows-1254 cp-1254, cp1254, ms-turk, windows-1254
windows-1255 cp-1255, cp1255, ms-hebr, windows-1255
windows-1256 cp-1256, cp1256, ms-arab, windows-1256
windows-1257 cp-1257, cp1257, winbaltrim, windows-1257
windows-1258 cp-1258, cp1258, windows-1258

7.1.3. Перекодировка во время индексации

indexer перекодирует все документы в кодировку, указанную в команде LocalCharset в файле indexer.conf. Внутри программы перекодировка реализована посредством промежуточного представления в виде Unicode. Особенность DataparkSearch состоит в том, что перекодировка между несовместимыми кодировками (например, между русской и греческой) не приводит к потере данных. В случае, если перекодировка какого-либо символа невозможна, DataparkSearch представит этот символ в базе данных в HTML-формате в виде &#NNN; где NNN - код символа, закрепленного за ним в Unicode. Таким образом, вне зависимости от выбора LocalCharset, DataparkSearch сохранит полную информацию о документе без каких-либо потерь. Однако, выбор LocalCharset влияет на размер базы данных.

7.1.4. Выбор LocalCharset

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

Если командой LocalCharset указана кодировка UTF-8, то это позволит сохранять любые символы, поддерживаемым в Unicode без необходимости представлять их в HTML-формате. Однако, следует иметь в виду, что это заведомо приводит к использованию до двух-трех байт на каждую не-латинскую букву. Например, на каждую букву кириллицы требуется два байта для сохранения ее в UTF-8.

Поскольку все кодировки включают в себя латинские буквы, то любая кодировка предоставляет поддержку по-крайней мере двух языков - английского и еще какого-то одного (или более) языка (единственное исключение - US-ASCII, поддерживающий только латинские буквы). Это означает, что при использовании DataparkSearch с LocalCharset, отличным от UTF-8, одновременная индексация документов с языками из одной группы не приводит к необходимости использовать HTML-формат, а значит не приводит к увеличению необходимого дискового пространства.

Например, если Ваша поисковая машина настроена использовать LocalCharset из 5-й группы (Кирилица), то документы на болгарском, белорусском, македонском, русском, сербском, украинском, а так же на английском языках будут сохранены компактно, с использованием одного байта на одну букву. Индексирование документов в других кодировках не из 5-й группы (включая UTF-8) также возможно; однако indexer будет использовать HTML-формат для сохранения букв, отличных от кирилических и английских. Сохранение, например, греческой буквы в кириллической кодировке требует применение семь байт на одну букву.

Таким образом, следует придерживаться следующего алгоритма при выборе LocalCharset: если Вы индексируете, например, в-основном кириллические и анлгийские документы, то выгоднее изпользовать LocalCharset из 5й группы. Если же Ваши документы сожержат информацию на языках из многих языковыз групп одновременно, то в качестве LocalCharset выгоднее использовать UTF8.

7.1.5. Определение кодировки документа

indexer определяет кодировку в документа в следующем порядке:

  1. "Content-type: text/html; charset=xxx"

  2. <META NAME="Content-Type" CONTENT="text/html; charset=xxx">

    Выбор этого варианта можно выключить указав команду GuesserUseMeta no в файле конфигурации indexer.conf.

  3. При выключенном автораспозновании: кодировка по-умолчанию, указанная командой "Charset"

    При включенном автораспознавании: результат работы автоматического распознавания кодировки.

7.1.6. Автоматическое распознавание кодировки

DataparkSearch имеет механизм автоматического распознавания кодировки и языка документа. В настоящее время распознается около 100 различных комбинаций кодировки и языка. Распознавание реализовано с использованием так называемой "N-Gram-Based Text Categorization" технологии. В комплекте программы поставляются файлы с так называемыми "картами языков", один файл на каждую пару кодировка-язык. По-умолчанию они устанавливаются в /usr/local/dpsearch/etc/langmap/. Чтобы увидеть полный список распознаваемых в настоящий момент языков и кодировок, взгляните в этот каталог. Распознавание работает хорошо на текстах в 500 байт и длиннее. Более короткие тексты могут распознаваться хуже. Для активизации автоматического распознавания кодировки необходимо загрузить языковые карты, используя команды LangMap.

7.1.6.1. Команда LangMapFile

Загружает из указанного файла карту языка и кодировки для автоматического их определения. Вы можете задать как абсолютный, так и относительный путь. Относительный путь задаётся от директории etc. Можно использовать несколько команд LangMapFile.


LangMapFile langmap/en.ascii.lm

7.1.6.2. Создание собственных карт языков

Для создания собственных карт языков служит утилита dpguesser. Кроме этой утилиты вам также потребуется файл-образец текстов на данном языке в нужной кодировке. Для создания своей карты языка используйте следующий формат команды:


        dpguesser -p -c charset -l language < FILENAME > language.charset.lm

Утилиту dpguesser можно также использовать для определения языка и кодировки файла на основании уже созданных карт языков. Для этого используйте следующий формат команды:


        dpguesser [-n maxhits] < FILENAME

Для некоторых языков существует несколько используемых кодировок. Для преобразования текстов из одной, поддерживаемой DataparkSearch кодировки, в другую предназначена утилита dpconv.


        dpconv [OPTIONS] -f charset_from -t charset_to [configfile] < infile > outfile

По умолчанию, утилиты dpguesser и dpconv устанавливаются в директорию /usr/local/dpsearch/sbin/.

Поддерживается автоматическое обновление карт языков и кодировок, если удалённый сервер возвращает чётко указаные язык и кодировку. Для включения этой возможности необходимо в файле indexer.conf указать команду


LangMapUpdate yes

По умолчанию, DataparkSearch использует только первые 8192 байт каждого индексируемого файла для определения языка и кодировки. Вы можете изменить это значение при помощи команды GuesserBytes. Используйте значение 0 для учёта всего такста индексируемого документа.


GuesserBytes 16384

7.1.7. Кодировка документов по-умолчанию

Используйте команду RemoteCharset в indexer.conf чтобы установить кодировку документов по-умолчанию.

Если индексируемый сервер не выдает кодировку документа ни в заголовке Content-Type, ни в META-тэге, и при этом автоматическое распознаывание либо отключено, либо не дало хорошего результата (т.е. язык и кодировка документа "не похожи" на представленные в загруженных картах), то в качестве кодировки документа будет использована кодировка, указанная в команде RemoteCharset. Если же кодировка по-умолчанию не указана, то будет использована iso-8859-1 (latin1).

7.1.8. Язык документов по-умолчанию

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


DefaultLang <string>

Задаёт язык документов по умолчанию.


DefaultLang en

7.1.9. Перекодировка во время поиска

Чтобы указать кодировку, в которой будут оторбражаться результаты поиска, используйте команду BrowserCharset в search.htm. BrowserCharset может отличаться от LocalCharset. Поисковая программа произведет перекодировку автоматически.

7.1.10. Команда LocalCharset

Задаёт кодировку, которая будет использоваться для хранения информации в базе данных. Данные во всех других кодировках будут перекодированы в эту кодировку. См. Разд. 7.1 для подробного описания как выбрать LocalCharset для языков, используемых на вашем сайте или сайтах, а также списка поддерживаемых кодировок. Эта команда должны быть задана один раз и имеет глобальный эффект для всего файла конфигрурации. Значение по умолчанию: iso-8859-1 (latin1).


LocalCharset koi8-r

7.1.11. Команда RemoteCharset


RemoteCharset <charset>

<сharset> - кодовая страница по умолчанию для последующих команд Server, Realm или Subnet. Используется при индексировании "плохих" серверов, не предоставляющих информации о кодировке в заголовках ответа сервера или в <META NAME="Content" Content="text/html; charset="some_charset"> на страницах. Команда действует до конца файла, или до следующей команды RemoteCharset. Значение по умолчанию: iso-8859-1 (latin1).


RemoteCharset iso-8859-5

7.1.12. Команда URLCharset


URLCharset <charset>

<charset> - кодовая страница для аргументов последующих команд Server, Realm или URL. Эта команда задаёт кодовубю страницу только для аргументов последующих команду и не влияет на определение кодировки индексируемых страниц. Имеет меньший приоритет, нежели команда RemoteCharset. Может задаваться перед каждой командой Server, Realm или URL и действует до конца файла конфигурации или до следующей команды URLCharset. Значение по умолчанию: ISO-8859-1 (latin1).


URLCharset KOI8-R

7.1.13. Команда CharsToEscape


CharsToEscape "\"&<>![]"

Используйте эту команду в вашем поисковом шаблоне для указания списка эскейп-символов для мета-переменных поискового шаблона типа $&(x).